我有 MainActivty
类和 DrawerLayout
,因此我动态添加 Fragments
。
public void selectDrawerItem(MenuItem menuItem) {
Fragment fragment = null;
Class fragmentClass;
switch(menuItem.getItemId()) {
case R.id.nav_websites:
fragmentClass = ScreenOne.class;
break;
case R.id.nav_commands:
fragmentClass = ScreenTwo.class;
break;
case R.id.nav_help:
fragmentClass = ScreenThree.class;
break;
default:
fragmentClass = ScreenOne.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
setTitle(menuItem.getTitle());
mDrawerLayout.closeDrawers();
}
在第一个 fragment
public class ScreenOne extends Fragment implements Button.OnClickListener
我有一个函数
public void loadText() {
SharedPreferences myPrefs;
myPrefs = getActivity().getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
siteName1.setText(myPrefs.getString("siteName1_txt", "").toString());
siteURL1.setText(myPrefs.getString("siteURL1_txt", "").toString());
}
在我的mainActivity类中,在onCreate方法中,我想调用loadText()方法,我尝试过
ScreenOne fragment = new ScreenOne();
fragment.loadText();
但这没有用。我无法通过 ID 或标签找到 fragment ,因为他们没有。请提供任何帮助或建议,我们将不胜感激。
最佳答案
您的代码存在几个大问题,这些是我看到的问题:
- 您确实需要了解 How Fragments work
- 你不知道你有哪个 Fragment,但总是 try to access ScreenOne
- 您想在 onCreate 中使用 fragment 方法而不关心 fragment lifecycle
- 您
尝试
创建一个 Fragment 实例,然后使用它even if it fails - 当您应该使用 newInstance and Arguments 时,您可以使用构造函数创建一个 fragment 。
- 您的 Activity 与您的 Fragment 耦合,因为您调用 concrete methods
话虽这么说,解决这个特定问题的最简单方法是仅在保证当前屏幕是当前屏幕时才调用 loadText 方法(即,在更改屏幕时执行此操作或保留对当前项目的引用并使用 instanceOf)
public void selectDrawerItem(MenuItem menuItem) {
...
try {
fragment = (Fragment) fragmentClass.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
...
if (ScreenOne.class.equals(fragmentClass)) {
fragment.loadText();
}
} catch (Exception e) {
e.printStackTrace();
}
}
但是我想澄清,这不是最干净的解决方案,我建议您坚持使用 single responsibility并让 fragment 负责加载自己的文本,而 Activity 负责将共享首选项中的值作为参数传递(或通过接口(interface) callback pattern )。这可以避免在 fragment 准备好之前调用 loadText 的任何更改。
关于java - 从 Fragment 中调用 MainActivity 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42718626/