【发布时间】:2014-11-29 16:30:03
【问题描述】:
我有以下问题:
我的 activity 的操作栏有一个自定义布局,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:divider="?android:attr/dividerVertical"
android:showDividers="middle"
android:dividerPadding="6dp">
<include layout="@layout/include_cancel_button" />
<include layout="@layout/include_done_button" />
</LinearLayout>
带有这样的按钮:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:actionButtonStyle"
android:id="@+id/actionbar_done"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="saveSchwein" >
<TextView style="?android:actionBarTabTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingRight="10dp"
android:drawableLeft="@drawable/ic_action_ok"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:text="@string/ok" />
</FrameLayout>
这个片段在活动的 onCreate() 期间被添加到 ViewPager,如下所示:
viewPager = (ViewPager) findViewById(R.id.schweinpager);
tabPagerAdapter = new SchweinFragmentAdapter(getSupportFragmentManager());
viewPager.setAdapter(tabPagerAdapter);
actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this).setTag(tab_name));
}
到目前为止,一切正常。我在操作栏中的选项卡中显示了三个片段,我可以毫无问题地在它们之间滑动切换。
现在我的实际问题来了: 我想从自定义操作栏调用片段内的函数。
activity中的saveSchwein()(因为没有找到fragment中的函数):
public void saveSchwein(View v) {
Fragment fragment = tabPagerAdapter.getItem(0);
((StammdatenFragment) fragment).saveSchwein();
}
以及片段中对应的函数:
public void saveSchwein() {
if (getActivity() == null) {
System.out.println("getActivity ist null");
}
if (rootView == null) {
System.out.println("rootView ist null");
}
if (isAdded()) { System.out.println("Attached to Activity"); } else { System.out.println("NOT attached to Activity"); }
Schwein schwein = new Schwein();
schwein.setName(add_name.getText().toString());
schwein.setGeschlecht(geschlecht_spinner.getSelectedItem().toString());
schwein.setRasse(rasse_spinner.getSelectedItem().toString());
schwein.setGeburtsdatum(add_geburtsdatum.getText().toString());
schwein.setBesonderheiten(add_besonderheiten.getText().toString());
}
rootView 和视图在 onCreateView() 期间被分配,如下所示:
rootView = inflater.inflate(R.layout.fragment_schwein_stammdaten, container, false);
add_name = (EditText) rootView.findViewById(R.id.add_name);
geschlecht_spinner = (Spinner) rootView.findViewById(R.id.geschlecht_spinner);
rasse_spinner = (Spinner) rootView.findViewById(R.id.rasse_spinner);
add_geburtsdatum = (TextView) rootView.findViewById(R.id.add_geburtsdatum);
add_besonderheiten = (EditText) rootView.findViewById(R.id.add_besonderheiten);
结果是rootView和getActivity()都为null,isAdded()为false,所以fragment不再附加到activity。在这一行,我得到了 nullpointerexception:
schwein.setName(add_name.getText().toString());
几天以来,我一直在寻找有关我的问题的答案,但还没有找到正确的答案。但是我通过了解片段的生命周期取得了进展,并发现这与片段在自定义操作栏中的操作期间不活动的事实有关。 使用像 Android Options Menu in Fragment 这样的选项菜单,它可以工作,但我更喜欢使用自定义操作栏!
有什么想法吗?
【问题讨论】:
标签: android android-fragments android-actionbar fragment android-lifecycle