java - 从 Fragment 中调用 MainActivity 中的方法

标签 java android

我有 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 ,因为他们没有。请提供任何帮助或建议,我们将不胜感激。

最佳答案

您的代码存在几个大问题,这些是我看到的问题:

话虽这么说,解决这个特定问题的最简单方法是仅在保证当前屏幕是当前屏幕时才调用 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/

相关文章:

android - 无法解析 firebase

android - BottomSheetFragment 是否需要 ViewModel?

java - 如何循环线程

java - 如何发送 Whatsapp 消息到新号码

java - Java中线程之间传递数据?

android - 我们可以在单个 TextView 上同时提供 onTouchListener 事件和 onClickListener 事件吗?

java - 如何将 CSV 文件中的数据作为事实传递给 Drools?

java - 如何修复 "Run Configuration Error: [No Rails found in SDK]"?

android - 服务器客户端套接字连接android

android - 如何将 ArrayList<CustomObject> 传递给另一个应用程序中的 Activity ?