Show Toast message even after Fragment has been detached?
我的应用程序使用带有几个菜单项的导航抽屉,这些菜单项基本上可以打开不同的片段。每个片段可以运行一个 AsyncTask,之后显示 Toast 消息。但是,当用户在另一个片段正在运行时尝试打开一个片段时,我会收到一个空指针错误,这是可以理解的,因为原始片段已被分离。
但是,即使在那时也有可能举行 Toast 表演吗?当在导航器上单击项目时,我基本上有此代码。
1
2 3 4 5 6 |
public void setFragment(Fragment fragment) {
getSupportFragmentManager() .beginTransaction() .replace(R.id.content, fragment) .commit(); } |
然后在片段上只是一个简单的 asynctask,它在 PostExecute 上显示 Toast 消息。
1
|
Toast.makeText(getContext(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
|
感谢任何帮助。
更新(2018 年 3 月 28 日)
我尝试使用监听器,它似乎工作。
我基本上有一个 BaseFragment,我的所有片段都在其中扩展。我只是在其中添加了一个回调。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class BaseFragment extends Fragment {
private OnToast callback; @Override public OnToast getCallback() { @Override public interface OnToast { |
在我的实际片段中,我有:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class JailsFragment extends BaseFragment {
private List<Jail> jailList = new ArrayList<>(); @Override if (savedInstanceState == null) { } @Override @Override } |
然后在我的 MainActivity 中:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, BaseFragment.OnToast {
private SharedPreferences pref; @Override @Override pref = PreferenceManager.getDefaultSharedPreferences(this); toolbar = (Toolbar) findViewById(R.id.toolbar); drawer = (DrawerLayout) findViewById(R.id.drawer_layout); navigationView = (NavigationView) findViewById(R.id.nav_view); if (savedInstanceState == null) { } @Override @SuppressWarnings("StatementWithEmptyBody") final int id = item.getItemId(); drawer.closeDrawer(GravityCompat.START); if (id == R.id.nav_plugins) { return true; public void setFragment(Fragment fragment) { } |
我假设你在这里收到了一个 nullPointer 异常
1
|
Toast.makeText(getContext(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
|
我会说你收到空指针是因为你没有上下文了。
可能的解决方案是:
1- 将您的应用程序声明为单例,然后您可以使用 MyApplication.getInstance() 并将其用作 Toast 消息的上下文。检查此链接以了解如何创建此单例。还建议使用 applicationContext 而不是 Activity 来获取 toast 消息
据我了解 getContext() 和 getActivity() 将返回相同的对象,这是活动,因此无济于事。
编辑 1:
您提出的解决方案的问题(对 Activity 的引用,在本例中为接口)是您可能存在内存泄漏。当我说”可能有”时,是因为您在输入此行时正在做一些特别的事情:
1
|
setRetainInstance(true);
|
您可能想阅读这篇文章。
当您不再需要 Activity(假设您移动到另一个 Activity)但由于某种原因片段(对象)尚未被销毁时,将产生内存泄漏。另一个例子是与互联网的低连接,然后用户可能会离开屏幕移动到另一个屏幕,但你的片段仍然活着,所以你的活动不能被垃圾收集。这就是为什么我不推荐你的方法:).
PS:抱歉回复晚了,我正在度假:P.
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269060.html