我想从我的活动中调用一个片段方法,在这个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。整个标签切换工作完美,但现在我想在活动中构建一个附加功能!
答案 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添加到我的片段时添加一个字符串(作为标记),而不必进行进一步的更改。