gpt4 book ai didi

android - 更新 fragment 以响应 Android 抽屉导航交互

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:57 25 4
gpt4 key购买 nike

我正在开发的 Android 应用程序只有一个 MainActivity,应用程序的每个屏幕都作为 fragment 实现。每个 fragment 在 MainActivity 中都像这样实例化为私有(private)类变量:

public class MainActivity extends Activity implements MainStateListener {

private FragmentManager fm = getFragmentManager();
private BrowseFragment browseFragment = BrowseFragment.newInstance();

...

有一个加载每个屏幕 fragment 的“fragment 框架”。在应用程序中切换屏幕时,将调用此代码来加载 fragment :

FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frag_frame, incoming);
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();

每个屏幕 fragment 都有一个监听器,使 fragment 能够调用 MainActivity 中的各种方法:

public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mainStateListener = (MainStateListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement MainStateListener");
}
}

我遇到的问题是从 MainActivity 中存在的抽屉导航更新 fragment 的一个方面。抽屉导航必须更新 fragment ,它使用此代码来执行此操作:

        navigationDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
browseFragment.doSomethingOnBrowserFragment();
}
});

在您改变方向之前一切正常。然后当前屏幕 fragment 加载正常(browseFragment)。但是,当您单击导致执行 doSomethingOnBrowserFragment() 方法的抽屉导航时,由于 mainStateListener 对象本身(附加到 browseFragment 中)为空,我得到一个空指针异常。根据我对 Fragment 生命周期的了解,这个变量不应该为 null,因为 onAttach() 方法在任何事情之前首先执行并设置 mainStateListener 变量。此外,如果我在使用 mainStateListener 对象的 browserFragment 上有一个按钮(在方向更改之后),则单击该按钮永远不会出现此空指针问题。

堆栈跟踪:

08-04 16:23:28.937  14770-14770/co.openplanit.totago E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: co.openplanit.totago, PID: 14770
java.lang.NullPointerException
at co.openplanit.totago.MapFragment.enableOfflineMode(MapFragment.java:489)
at co.openplanit.totago.MainActivity.setMapMode(MainActivity.java:663)
at co.openplanit.totago.MainActivity.itineraryMapDrawerSelectItem(MainActivity.java:610)
at co.openplanit.totago.MainActivity.access$200(MainActivity.java:52)
at co.openplanit.totago.MainActivity$5.onItemClick(MainActivity.java:420)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2957)
at android.widget.AbsListView$3.run(AbsListView.java:3850)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)

在我看来,问题可能在于使用抽屉导航实际上是在与 browseFragment 生命周期交互并导致它分离或其他原因。

如有任何关于如何解决此问题的建议,我们将不胜感激。

最佳答案

在 fragment 管理器为您重新创建 fragment 的情况下,保留对 fragment 的引用可能会使您与对分离的旧 fragment 的引用不同步。

解决办法是找到当前frag_frame中的fragment,伪代码:

Fragment fragment = fm.findFragmentById(R.id.frag_frame);
if(fragment instanceof BrowseFragment) {
// do your stuff
}

关于android - 更新 fragment 以响应 Android 抽屉导航交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com