如何在使用制表符和片段容器时识别我的活动的当前片段?

时间:2013-09-03 16:19:48

标签: android android-fragments

我想从我的活动中调用一个片段方法,在这个SO问题中描述:FindByID

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

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

如图所示,它们通过在xml中设置的ID来识别片段。因为我只有一个片段容器,所以我的片段布局都没有ID。

所以我的秒钟想法是使用函数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。整个标签切换工作完美,但现在我想在活动中构建一个附加功能!

2 个答案:

答案 0 :(得分: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();

}

这样您就可以获得当前标记。要识别当前片段,您可以保留一堆片段,并在制表符更改时选择正确的片段。

修改

上述tabId标识哪个标签是哪个。为了设置片段ID /标签,有很多方法可以根据您的需要而定。一种方法是用中间布局替换实际的片段布局。

例如,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中。现在将Intermediate片段添加到容器中,容器依次拉出片段A.通过添加的id / tag识别片段A布局。

希望它有道理!

答案 1 :(得分: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添加到我的片段时添加一个字符串(作为标记),而不必进行进一步的更改。