2013-05-18 5 views
0

Как включить фрагменты внутри вкладки?Переключить фрагменты внутри вкладки

Мое приложение содержит три фрагмента, фрагмент, BFragment и CFragment. Эти фрагменты, в свою очередь, соответствуют их собственным файлам макетов: AFragment содержит кнопку, а BFragment и CFragment имеют TextView. Существует четвертый файл макета с именем activity_main.

Теперь у меня есть четыре класса: MainActivity, AFragment, BFragment и CFragment. Классы AFragment, BFragment, CFragment только типичные содержат OnCreateView для каждого из них.

MainActivity содержит следующее:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    appContext = getApplicationContext(); 

    //ActionBar 
    ActionBar actionbar = getActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A"); 
    ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B"); 

    Fragment PlayerFragment = new AFragment(); 
    Fragment StationsFragment = new BFragment(); 

    PlayerTab.setTabListener(new MyTabsListener(PlayerFragment)); 
    StationsTab.setTabListener(new MyTabsListener(StationsFragment)); 

    actionbar.addTab(PlayerTab); 
    actionbar.addTab(StationsTab); 

И тогда TabListener:

class MyTabsListener implements ActionBar.TabListener { 
public Fragment fragment; 

public MyTabsListener(Fragment fragment) { 
    this.fragment = fragment; 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    ft.replace(R.id.fragment_container, fragment); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    ft.remove(fragment); 
} 

}

Как вы можете видеть, activity_main.xml содержит только LinearLayout с идентификатором '' fragment_container для вкладок AFragment и BFragment. Теперь я хочу, чтобы это было так, что нажатие кнопки в AFragment переключает весь AFragment на CFragment. Как я могу это достичь? Спасибо.

(EDIT) Я сделал следующее, но мое приложение разбилось на старте. Что я сделал не так?

Я добавил следующее в моем MainActivity.java, чуть ниже последовательности ActionBar:

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
appContext = getApplicationContext(); 

//ActionBar 
.... 
.... 
.... 
Button mButton = (Button) findViewById(R.id.button1); 
    mButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      CFragment fragment = new CFragment(); 
      fragmentTransaction.add(R.id.fragment_container, fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 
+0

Не связанные, но уважающие соглашения о кодировке java. Переменные начинаются с строчной буквы. Ваш код будет легче читать. – Snicolas

+0

спасибо, сделаю. Сожалею. – Mnemone

ответ

0
  • получить транзакцию с использованием фрагмента (поддержка) фрагмента менеджера вашей деятельности.
  • заменить AFragment на CFragment, как вы это делали в onTabSelected
  • совершите транзакцию.

Кроме того, обратите внимание:

  • не хранят ссылки на ваш фрагмент, вы на самом деле предотвратить вывоз мусора из встречающейся. Вы должны создавать свои фрагменты один раз, а не каждый раз. В TabSelected проверьте, известен ли фрагмент менеджеру фрагментов (используя findFragmentByTag). Если нет, создайте его. Если это так, просто замените его.
  • Поделитесь своим слушателем, вам не нужна одна за вкладкой.
+0

Большое спасибо за ответ, сэр. У вас есть пример, как выполнить транзакцию фрагмента в OnClick? И где я могу это выразить - внутри фрагментации или в MainActivity? Извините, если мои вопросы звучат так глупо. – Mnemone

+0

Вы должны делать это внутри своей деятельности, так как он будет знать оба фрагмента. Это не глупо, на самом деле есть некоторые детали, которые не будут простыми, но google и SOF - ваши друзья. – Snicolas

+0

Здравствуйте, Snicolas. Я добавил что-то в свой код ... можете ли вы взглянуть на него? Я обновил свой вопрос. :( – Mnemone

Смежные вопросы