2013-09-03 2 views
2

Я хочу, чтобы вызвать метод фрагмент из моей деятельности, описать, как в этом так вопрос: FindByIDКак определить текущий фрагмент моей активности при использовании вкладок и контейнера фрагментов?

TestFragment testFrag = (TestFragment) getFragmentManager().getFragmentById(R.id.testfragment); 

if(testFrag != null && testFrag.isAdded()) 
    testFrag.testMethod("Test"); 

Как видно они идентифицируют фрагмент по идентификатору, который установлен в XML. Поскольку у меня только контейнер с фрагментами, ни один из моих макетов фрагментов не имеет идентификатора.

Так моя секунд мысль с помощью функции getFragmentByTag `как в Tags

fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag"); 
  • но я использую панель действий с вкладками не имеют каких-либо тегов:

Мои деятельность:

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

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

    // Define Tabs 
    ActionBar.Tab BasicInfoTab = actionbar.newTab().setText(
     R.string.tab_BaseInfo); 
    .. 

    // Define Fragments 
    PlantBasicInfoFragment BasicInfoFragment = new PlantBasicInfoFragment(); 
    .. 

    // Set TabListeners 
    BasicInfoTab.setTabListener(new TabListener(BasicInfoFragment)); 
    .. 

    // Add tabs to Actionbar 
    actionbar.addTab(BasicInfoTab); 
    .. 

    // Icon clickable 
    actionbar.setDisplayHomeAsUpEnabled(true); 
} 

и его расположение:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center"> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:id="@+id/LabeledObjectHeaderInfo" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      > 


     <!-- ... --> 

    </LinearLayout > 


     <!-- fragment container --> 
    <LinearLayout 
      android:orientation="horizontal" 
      android:id="@+id/fragment_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      > 
    </LinearLayout> 

</LinearLayout> 

Один из моих фрагментов:

<?xml version="1.0" encoding="utf-8"?> 

    <TableLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:id="@+id/table"> 

     <TableRow> 
      <!-- ... --> 
     </TableRow> 

     <!-- ... --> 


    </TableLayout> 

и, наконец, моя вкладка слушателем

public class TabListener implements ActionBar.TabListener { 

    public Fragment fragment; 

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


    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 

    @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); 

    } 

} 

Так как я могу определить мой текущий фрагмент?

Заранее благодарен

P.S. Переключение всех вкладок работает отлично, но теперь я хочу создать дополнительную функцию внутри своей деятельности!

+0

isInstanceOf(), ведь все фрагменты являются классными! –

ответ

0

Наконец, я получил свое решение, изменив TabListener, поэтому я могу добавить фрагмент с тегом, а затем использовать функцию findFragmentByTag().

Так что мой TabListener теперь выглядит следующим образом (только конструктор и onTabSelected изменены)

public TabListener(Fragment fragment, String tag) { 
    this.fragment = fragment; 
    this.fragmentTag = tag; 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    ft.replace(R.id.fragment_container, fragment, fragmentTag); 
} 

С этим нужно только добавить строку (как тег) при добавлении TabListener в мои фрагменты и не имеет для дальнейших изменений.

0

Добавить ярлык при создании вкладок.

ActionBar.Tab BasicInfoTab = actionbar.newTab().setText(R.string.tab_BaseInfo); 
BasicInfoTab.setTag("tab1"); 

И в классе слушателя извлеките тег при событии.

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    String tabId = tab.getTag().toString(); 

} 

Таким образом, вы получаете текущий тег. Чтобы идентифицировать текущий фрагмент, вы можете сохранить стек фрагментов и выбрать правильный вариант смены вкладки.

Редактировать

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

Например, A - фрагмент, который вы хотите добавить в контейнер фрагмента. Создайте еще один класс фрагментов под названием IntermediateFragment со следующим макетом.

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

<fragment 
    android:id="@+id/fragmentId" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="classA" /> 

</LinearLayout> 

Теперь назначьте макет, упомянутую в пост (содержащий таблицу) в качестве нового и добавить его фрагмент класса A. Теперь добавьте промежуточный фрагмент в контейнер, который, в свою очередь потянет фрагмент А. Определение фрагмента А по идентификатору/tag добавлен в макет.

Надеюсь, это имеет смысл!

+0

Как я могу получить доступ к tabId в своей деятельности, когда он установлен в прослушивателе вкладок? Метод, в котором я хочу получить доступ к текущей вкладке, находится в моей активности? и менеджеры фрагментов всегда возвращают 'null', когда я пытаюсь найти' findFragmentByTag' после установки тега, как вы описали. – bish

+0

@bish проверить мой обновленный ответ – Renjith

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