Вкладки ActionBar с ViewPager и Frame Layout

Я хотел использовать вкладки ActionBar и ViewPager для реализации переключения между вкладками. Я успешно использовал пример здесь:

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

Однако я также хотел добавить макет фрейма вне ViewPager в xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/FrameLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </android.support.v4.view.ViewPager>   

    <FrameLayout
        android:id="@+id/frame_layout"
        android:name="com.banagas.calculator.ButtonFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

Если я установлю setContentView() в свой макет как с ViewPager, так и с Frame Layout, ViewPager перестанет работать:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity", "onCreate");  
        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.FrameLayout1);
        ActionBar bar = getSupportActionBar();
        mViewPager.setOffscreenPageLimit(4);

        bar.setDisplayHomeAsUpEnabled(false);
        bar.setDisplayShowTitleEnabled(false);
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        mTabsAdapter = new TabsAdapter(this, mViewPager);

        mTabsAdapter.addTab(bar.newTab().setText("Display"), DisplayFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("Y="), YFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("Graph"), GraphFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("Table"), TableFragment.class, null);

        if (findViewById(R.id.frame_layout) != null) 
        {
            if (savedInstanceState != null) 
            {
                return;
            }
            getSupportFragmentManager().beginTransaction().add(R.id.frame_layout, new ButtonFragment()).commit();
            Log.i("MainActivity", "add.ButtonFragment");
        }
    }

Я вижу вкладки и ничего больше в ViewPager. Однако мой макет кадра работает отлично. Как мне заставить ViewPager работать с этим?


person vabanagas    schedule 24.12.2012    source источник
comment
вероятно, это не связано с ошибкой, но: 1. Почему вы добавили имя фрагмента (ButtonFragment) для FrameLayout? 2. Лучше сначала проверить saveInstanceState != null и только потом искать представление.   -  person vovkab    schedule 25.12.2012
comment
На самом деле я использую FrameLayout для переключения между двумя фрагментами при нажатии кнопки, и я отформатировал его таким образом, потому что мне сказали, что это правильный способ сделать это, но я попробую по-другому.   -  person vabanagas    schedule 25.12.2012
comment
Что ничего другого в ViewPager не означает? Занимает ли FragmentLayout все пространство или фрагменты не создаются?   -  person Wolfram Rittmeyer    schedule 25.12.2012
comment
Фрагменты просто не создаются. Вкладки создаются и проблем с версткой нет. ViewPager просто не будет реализовывать фрагменты.   -  person vabanagas    schedule 25.12.2012


Ответы (1)


Почему вы делаете mViewPager = new ViewPager(this); mViewPager.setId(R.id.FrameLayout1); ?

ViewPager уже находится на вашем макете.

Нужно сделать что-то вроде mViewPager = (ViewPager)findViewById(R.id.FrameLayout1);

Из примера кода они создают элементы управления во время выполнения, а у вас они есть в xml.

person soynerdito    schedule 12.02.2013