Android 在使用选项卡和片段容器时,如何识别活动的当前片段?

Android 在使用选项卡和片段容器时,如何识别活动的当前片段?,android,android-fragments,Android,Android Fragments,我想从我的活动中调用一个片段方法,在这个问题中描述如下: 如图所示,它们通过xml中设置的ID标识片段。因为我只有一个片段容器,所以我的所有片段布局都没有ID 所以我的第二个想法是使用函数getFragmentByTag`就像 但当我使用带有标签的操作栏时,我没有任何标签: 我的活动: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

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

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

所以我的第二个想法是使用函数
getFragmentByTag
`就像

  • 但当我使用带有标签的操作栏时,我没有任何标签:
我的活动:

@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>
那么我如何识别我当前的片段呢

提前谢谢


另外,整个标签切换工作得非常好,但现在我想在活动中建立一个附加功能

在创建选项卡时添加标记

ActionBar.Tab BasicInfoTab = actionbar.newTab().setText(R.string.tab_BaseInfo);
BasicInfoTab.setTag("tab1");
在listener类中,在事件发生时检索标记

@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。现在将中间片段添加到容器中,容器将依次提取片段a。通过布局中添加的id/标记标识片段a


希望这有点道理

最后,我通过更改TabListener得到了解决方案,这样我就可以添加带有标记的片段,然后使用
findFragmentByTag()
函数

所以我的TabListener现在看起来像这样(只有构造函数和
onTabSelected
changed)


这样,在将TabListener添加到片段时,我只需要添加一个字符串(作为标记),而不必做进一步的更改。

isInstanceOf(),在所有片段都是类之后!在选项卡侦听器中设置选项卡ID时,如何访问活动中的选项卡ID?我想访问当前选项卡的方法在我的activit中?在设置了如您所述的标记之后,当我尝试查找
findFragmentByTag
时,片段管理器总是返回
null
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);

  }

}
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();

}
<?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> 
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);
}