2013-05-07 5 views
1

Итак, я пытаюсь выяснить, возможно ли это. Мне нужно загрузить два fragments в два контейнера в том же activity из одного выбранного tab.несколько фрагментов из ONE ActionTab

Я нашел Android - Multiple fragments in ONE tab

, но никто не ответил на этот вопрос.

Итак, вот пример кода и то, что я пробовал.

слушатель

surveyTabListener = new TabListener<Load_Fragment>(this, 
      R.id.header_fragment_container, Load_Fragment.class); 

onTabSelected

public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     if (fragment == null) { 
      String fragmentName = fragmentClass.getName(); 
      fragment = Fragment.instantiate(activity, fragmentName); 
      ft.add(fragmentContainer, fragment, fragmentName); 
     } else 
      ft.attach(fragment); 
} 

Теперь я пытался добавить второй listener к inflate 2-й fragment как это

surveyTabListener2 = new TabListener<Store_Fragment>(this, 
      R.id.store_fragment_container, Store_Fragment.class); 

, и я также пытался использовать вторую if else заявления в onTabSelected как этот

public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     if (fragment == null) { 
      String fragmentName = fragmentClass.getName(); 
      fragment = Fragment.instantiate(activity, fragmentName); 
      ft.add(fragmentContainer, fragment, fragmentName); 
     } else 
      ft.attach(fragment);       

     if (fragment2 == null) { 
      String fragmentName2 = fragmentClass2.getName(); 
      fragment2 = Fragment.instantiate(activity, fragmentName2); 
      ft.add(fragmentContainer2, fragment2, fragmentName2); 
     } else 
      ft.attach(fragment2); 

    } 

Ни работа, я либо получить NPE (null pointer) или абсолютно ничего не происходит, но я не получаю никаких ошибок.

Это похоже на то, что нужно делать довольно часто, но я не могу понять, как это понять.

+0

Я не уверен, что понимаю вашу проблему. Когда вы говорите: «Мне нужно загрузить два фрагмента в два контейнера», вы имеете в виду, что каждый контейнер будет иметь два фрагмента или вы имеете в виду, что у вас будет два контейнера, каждый из которых имеет один фрагмент? – Squonk

+0

@Squonk Мне нужно раздуть 2 отдельных контейнера по 1 фрагменту каждый (фрагменты индивидуальны, это не один и тот же фрагмент). Они должны накачаться одновременно, нажав 1 вкладку. Это макеты фрагментов по умолчанию, которые я хочу раздуть. Цель состоит в том, чтобы, если пользователь переходит из Tab «A» в Tab «B», два фрагмента будут разными, поэтому пользовательский интерфейс изменится. – IrishWhiskey

+0

Вы не вызываете 'commit()' на свой 'FragmentTransaction'. Пример ... 'ft.add (fragmentContainer, фрагмент, имя_файла) .commit();' - попробуйте и посмотрите, что произойдет. – Squonk

ответ

1

осенило меня, что я буду об этом неправильно. Я понял, как сделать то, что я искал, и это было довольно просто. Если у кого-то еще есть эта проблема, это решение.

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     //get the name of the tab currently selected 
     String name = (String) tab.getText().toString(); 

     // compare it to the tab you would like to do something with   
     if (name == "Assets") { 
      //load the 1st fragment 
      fragment = new Store_Fragment(); 
      getFragmentManager().beginTransaction() 
        .setCustomAnimations(android.R.animator.fade_in, 
          android.R.animator.fade_out) 
        .replace(R.id.store_fragment_container, fragment).commit(); 

      //load the 2nd fragment 
      fragment2 = new Load_Fragment(); 
      getFragmentManager().beginTransaction() 
        .setCustomAnimations(android.R.animator.fade_in, 
          android.R.animator.fade_out) 
        .replace(R.id.header_fragment_container, fragment2).commit(); 
     } 

... и все. Надеюсь, это поможет другим.

+0

Можете ли вы объяснить замену (R.id.store_fragment_container, фрагмент), что есть store_fragment_container, пожалуйста – VenushkaT

2

Вам нужно использовать пустой фрагмент в качестве контейнера для ваших двух фрагментов, я собираюсь опубликовать код, чтобы показать вам, как я его удаляю.

Вот фрагмент контейнера:

public static class FragmentInsideContainer extends Fragment { 

     ListView mainListView; 
     ArrayAdapter<Producer> listAdapter; 
     TextView inputSearch; 
     static FragmentInsideContainer containerReference; 
     String idProd; 

     public FragmentInsideContainer() { 

     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.layoutcontaineprod, container, false); 

      FragmentInsideContainer.containerReference = this; 

      FragmentDetailProd fragmentDetailProd = new FragmentDetailProd(); 
      FragmentDetailProd.id = this.idProd; 

      DummySectionFragment2.currentDetailProdFragment = fragmentDetailProd; 

      FragmentListWine fragmentListWine = new FragmentListWine(); 
      fragmentListWine.id = this.idProd; 

      DummySectionFragment2.currentListWineFragment = fragmentListWine; 

      FragmentInsideContainer.containerReference.getChildFragmentManager().beginTransaction().replace(R.id.containerDetail, fragmentDetailProd).commit(); 
      FragmentInsideContainer.containerReference.getChildFragmentManager().executePendingTransactions(); 
      FragmentInsideContainer.containerReference.getChildFragmentManager().beginTransaction().add(R.id.containerDetail, fragmentListWine).commit(); 
      FragmentInsideContainer.containerReference.getChildFragmentManager().executePendingTransactions(); 

      return rootView; 
     } 
+0

Мне всегда говорили, что «вложенные» фрагменты плохие или не будут работать. Мне интересно посмотреть, как вы это сделали. – IrishWhiskey

+1

Я не знаю, хорошее ли это решение, но это единственный способ, который, как мне казалось, сработал для меня. Скажите, нужен ли вам больше кода или xml-файлов.Надеюсь, это поможет –

+0

Я понимаю, о чем вы говорите, но я не думаю, что вы полностью понимаете, о чем я прошу. Я знаю, как раздувать два фрагмента одновременно. Однако я не понимаю, как это сделать из «ActionBar' Tab». Если это было сделано с помощью вкладки 'ActionBar'', отправьте код' слушателя' и/или код 'onTabSelected'. – IrishWhiskey