Фрагменты Viewpager разных размеров экрана - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть FragmentActivity, в котором используются 2 разных макета, зависит от размера экрана:

  1. xLarge Landscape.В макете есть 3 LinearLayouts, каждый из которых содержит 1 фрагмент.

  2. Размеры остальных экранов.Макет имеет 1 ViewPager, который содержит все фрагменты.

Приложение падает, когда ориентация экрана изменяется на 10-дюймовом экране.Он использует размер экрана 1 в альбомном режиме и размер 2 в портретном режиме.

Код:

public class RegistroAccionesPartidoActivity extends FragmentActivity {


private static ArrayAdapter<Fragment> mFragmentArray;
private ViewPager mMyPager;
private Fragment1 mFragment1;

private Fragment2 mFragment2;
private Fragment3 mFragment3;
private MyFragmentAdapter mFragmentsAdapter;
private FragmentManager mFragmentManager;
private FragmentTransaction mFragmentTrasaction;


@Override
public void onCreate(Bundle savedState) {
    super.onCreate(savedState); 
    setContentView(R.layout.my_layout); 


    LinearLayout layoutFragment1 = (LinearLayout)findViewById(R.id.fragment1);


    if(layoutFragment1 == null) {

        mFragmentManager = getSupportFragmentManager();

        mMyPager = (ViewPager) findViewById(R.id.my_pager);
        mFragmentArray = new ArrayAdapter<Fragment>(getApplicationContext(),android.R.layout.simple_list_item_1);
        mFragmentsAdapter = new Fragment2Adapter(mFragmentManager);


        if(savedState == null) { 

            mFragment2 = new Fragment2(true);
            mFragment3 = new Fragment3();
            mFragment1 = new Fragment1(mIdPartido, mIdEquipoLocal, mIdEquipoVisitante);
        } else {

            mFragment1 = (Fragment1) getSupportFragmentManager().getFragment(savedState, "fragment1");
            mFragment2 = (Fragment2) getSupportFragmentManager().
            getFragment(savedState,"fragment2");
            mFragment3 = (Fragment3) getSupportFragmentManager().
            getFragment(savedState, "fragment3");
        }


        mFragmentArray.add(mFragment1);
        mFragmentArray.add(mFragment2);
        mFragmentArray.add(mFragment3);

        mDatosPartidoPager.setAdapter(mFragmentsAdapter);

        mDatosPartidoPager.setCurrentItem(1);


       } else { // xLarge Version

        mFragmentManager = getSupportFragmentManager();
        mFragmentTrasaction = mFragmentManager.beginTransaction();


        if(savedState == null) {
            mFragment1 = new Fragment1();
            mFragment2 = new Fragment2();
            mFragment3 = new Fragment3();


        } else {
            mFragment1 = (Fragment1) getSupportFragmentManager().
                getFragment(savedState, "fragment1");

            mFragment2 = (Fragment2) getSupportFragmentManager().
                getFragment(savedState,"fragment2");
            mFragment3 = (Fragment3) getSupportFragmentManager().
                getFragment(savedState, "fragment3");
    }
    mFragmentTrasaction.add(R.id.fragment1, mFragment1);
    mFragmentTrasaction.add(R.id.fragment2, mFragment2);
    mFragmentTrasaction.add(R.id.fragment3, mFragment3);
    mFragmentTrasaction.commit();
    }

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    getSupportFragmentManager().putFragment(outState, "fragment2" , 
        mFragment2);
    getSupportFragmentManager().putFragment(outState, "fragment3", 
        mFragment3);

    getSupportFragmentManager().putFragment(outState,"fragment1", 
        mFragment1);

    }
}

Макет XLarge:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">

</LinearLayout>


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">

</LinearLayout>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment3"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">

</LinearLayout>


</LinearLayout>

Макет остальных размеров экрана:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/my_pager">

    </android.support.v4.view.ViewPager>

</LinearLayout>

У меня 2 различных сбоя в зависимости от порядка изменения экрана:

  1. Начиная с альбомной ориентации, сообщение об ошибке:

java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x ...... для фрагмента 2

  1. Когда я запускаю портрет, ошибкасообщение:

java.lang.IllegalStateException: фрагмент уже добавлен: Fragment1

Извините за большой вопрос.Я просто попытался объяснить свою проблему.

Большое спасибо.

РЕДАКТИРОВАТЬ: В больших устройствах (например, 10 '') ландшафтный режим использует xLarge Layout иВ портретном режиме используется другой макет.

1 Ответ

0 голосов
/ 09 февраля 2012

для меня (внутри XLarge Layout) вложенные LinearLayout-Elements, смешивающие горизонтальную и вертикальную ориентацию, выглядят довольно странно. Пожалуйста, посмотрите поближе, если вы намеревались таким образом вложить.

Привет, Wolfgang

...