2016-02-16 4 views
1

У меня есть MainActivity, и я хочу прикрепить к нему этот фрагмент с 3 кнопками. При нажатии кнопки 1 он должен заменить этот фрагмент на другой фрагмент. Но когда я меняю ориентацию, текущий фрагмент и старый фрагмент присоединяются. Может ли кто-нибудь помочь мне решить эту проблему?Работа с несколькими фрагментами при изменении ориентации

Ниже мой MainActivity.java:

public class MainActivity extends AppCompatActivity implements OnButtonsClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     getSupportFragmentManager().beginTransaction() 
       .add(R.id.mainactivity, new FragmentHomepage(), "aboutMe") 
       .commit(); 

    } 




    @Override 
    public void button1Action() { 
     FragmentAboutMe fragmentAboutMe=new FragmentAboutMe(); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.mainactivity,fragmentAboutMe) 
       .commit(); 
    } 

    @Override 
    public void button2Action() { 
     Intent intent =new Intent(this,ActivityMasterDetail.class); 
     startActivity(intent); 
    } 

    @Override 
    public void button3Action() { 
     Intent intent =new Intent(this,ActivityViewPager.class); 
     startActivity(intent); 
    } 
} 

Это мой FragmentHomepage.java:

public class FragmentHomepage extends Fragment { 
    private static final String ARG_SECTION_NUMBER ="section number"; 
    OnButtonsClickListener onButtonsClickListener; 
    public static FragmentHomepage newInstance(int sectionNumber){ 
     FragmentHomepage fragmentHomepage=new FragmentHomepage(); 
     Bundle args=new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER,sectionNumber); 
     fragmentHomepage.setArguments(args); 
     return fragmentHomepage; 
    } 
    public FragmentHomepage(){} 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      onButtonsClickListener= (OnButtonsClickListener) context; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     final Button button1= (Button) getActivity().findViewById(R.id.aboutMe); 
     final Button button2= (Button) getActivity().findViewById(R.id.task2); 
     final Button button3= (Button) getActivity().findViewById(R.id.task3); 
     button1.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onButtonsClickListener.button1Action(); 
      } 
     }); 
     button2.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onButtonsClickListener.button2Action(); 
      } 
     }); 
     button3.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onButtonsClickListener.button3Action(); 
      } 
     }); 

    } 

    @Nullable 
    @Override 
    public View onCreateView(final LayoutInflater inflater, 
          ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView=null; 
     rootView =inflater.inflate(R.layout.fragment_homepage,container,false); 
     return rootView; 
    } 
} 

и моя вторая деятельность заключается в следующем (в FragmentAboutMe.java):

public class FragmentAboutMe extends Fragment { 
    int counters=0; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState==null)counters=0; 
     else counters=savedInstanceState.getInt("count"); 

    } 

    @Override 

    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("count",13); 

    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_aboutme,container,false); 
    } 
} 

ответ

1

В вашем методе onCreate() поместите проверку, присутствует ли этот фрагмент. Android автоматически восстанавливает состояние диспетчера фрагментов при изменении ориентации и, следовательно, при изменении ориентации фрагмент, который вы добавили при нажатии кнопки, будет автоматически добавлен. Таким образом, если вы не добавите новый фрагмент в onCreate() без проверки, это приведет к добавлению 2 фрагментов. Это вызывает проблему.

FragmentManager fm = getSupportFragmentManager(); 

if (fm.findfragmentById(R.id.mainactivity) == null) { 
    FragmentHomepage fragment = new FragmentHomepage(); 
    fm.beginTransaction().add (R.id.mainactivity, fragment).commit(); 
} 
+0

безупречный. Большое спасибо :) –

0

Вы бы хотите сохранить состояние. Вам нужно будет увеличить Fragment, чтобы сохранить объекты, требующие сохранения.

Переопределите onConfigurationChanged(..) и он должен работать.

Когда мне пришлось обрабатывать изменения ориентации экрана, я помню, что использовал эту ссылку [link].

0

Существует два способа.

Либо вам нужно сохранить состояние в пакете в методе onSaveInstanceState(). Также сохраните состояния фрагмента.

Когда активность воссоздается, проверьте значение пакета внутри метода onCreate() или onRestoreInstanceState(). Теперь инициализируйте все объекты, как и раньше.

остальное установить значение активности внутри файла манифеста, как

android:configChanges="layoutDirection|orientation|screenLayout|screenSize" 

и переопределить метод.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 

} 

Второй метод не позволит перезапускать работу при изменении ориентации.