Фрагмент || onConfigurationChanged || дублировать - PullRequest
2 голосов
/ 23 февраля 2012

У меня проблемы с фрагментом при изменении ориентации экрана.В моем коде я создал другой макет XML в соответствии с ориентацией экрана.Например, у меня есть header_landscape.xml и header_portrait.xml в каталоге макета.И каждый отдельный заголовок имеет один и тот же фрагмент в линейном макете.Поэтому, когда я включаю свое устройство, у меня появляется ошибка «дублированный идентификатор ...», соответствующая моему фрагменту.

Различия в макете - это содержание. Когда я нахожусь в «альбомной», я отображаю больше информации, чем в «портретной».*

$ Код модификации макета при изменении ориентации экрана.

 public void onConfigurationChanged(Configuration newConfig)
 {
        super.onConfigurationChanged(newConfig);


        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE && isLoaded && oldScreenStateOrientation!=newConfig.orientation)
        {

            setContentView(R.layout.main_landscape);

            //header
            date=(TextView)findViewById(R.id.headerLandscapeDate);
            routeSens=(TextView) findViewById(R.id.headerLandscapeRouteSens);
            pkHeader=(TextView) findViewById(R.id.headerLandscapePk);

            maListViewPerso = (ListView) findViewById(R.id.ListeChoix);  
            //On attribut à notre listView l'adapter que l'on vient de créer
            maListViewPerso.setAdapter(chargeMenu());
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT && isLoaded && oldScreenStateOrientation!=newConfig.orientation)
        {

            setContentView(R.layout.main_portrait);


            routeSens=(TextView) findViewById(R.id.headerPortraitRouteSens);
            pkHeader=(TextView) findViewById(R.id.headerPortraitPk);

            maListViewPerso = (ListView) findViewById(R.id.ListeChoix);  
            //On attribut à notre listView l'adapter que l'on vient de créer
            maListViewPerso.setAdapter(chargeMenu());
        }
      }

Если у кого-то есть решение.Я разработал api8 (фрагмент библиотеки совместимости).

Извините за мой английский.

Спасибо

Ответы [ 2 ]

3 голосов
/ 06 апреля 2012

Если вам по какой-то причине необходимо самостоятельно изменить ориентацию, решение состоит в том, чтобы удалить фрагмент перед вызовом setContentView (). Вот код, который работал в моем случае:

    @Override
    public void onConfigurationChanged(final Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // We must remove the fragment, otherwise we get a duplicate ID error when the
        // onCreateView() method is executed.
            final FragmentManager fm = this.getSupportFragmentManager();
        ExtrasFragment ef = (ExtrasFragment) fm.findFragmentByTag(ExtrasFragment.FRAGMENT_TAG);
        if( ef != null ) {  // for small screens the fragment is not embedded in this activity
            final FragmentTransaction ft = fm.beginTransaction();
            ft.remove(ef);
            ft.commit();
            ef = null;
            fm.executePendingTransactions();
        }
        this.setContentView(R.layout.main); // contains the ExtrasFragment
    ...
}
1 голос
/ 23 февраля 2012

Вы должны позволить Android сделать всю эту настройку переключения для вас!Ничего не делайте в "onConfigurationChanged", даже удалите все изменения конфигурации из своего манифеста!

Поместите макет вашего портрета в layout / folder

и поместите ваш альбомный макетв layout-land / folder

Убедитесь, что они оба названы: main.xml (или что-нибудь, если оно одинаковое)

Затем в вашем activity.onCreate выполните что-то вроде этого:

    // Will automatically select the correct layout
    setContentView(R.layout.main); 

    //header
    // If this is in portrait, date will be null. Check for that later
    date=(TextView)findViewById(R.id.headerDate);
    routeSens=(TextView) findViewById(R.id.headerRouteSens);
    pkHeader=(TextView) findViewById(R.id.headerPk);

    //Récupération de la listview créée dans le fichier main.xml
    maListViewPerso = (ListView) findViewById(R.id.ListeChoix);      

    //On attribut à notre listView l'adapter que l'on vient de créer
    maListViewPerso.setAdapter(chargeMenu());

Таким образом, вы можете позволить Android беспокоиться о том, какую конфигурацию использовать.Если вы хотите отображать альбомную ориентацию только на больших экранах, вы можете поместить ее в папку, например layout-w1024dp .Таким образом, вы можете легко иметь несколько макетов.

...