来自Fragment的MainActivty中的调用方法

时间:2017-03-10 12:38:07

标签: 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();
}

在第一个片段中

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或标签找到片段,因为它们不会惹恼任何片段。拜托,非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:1)

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

话虽如此,对于这个特定问题最简单的解决方法是只保证当前屏幕时调用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并让片段负责加载自己的文本,而活动负责从中传递值共享首选项作为参数(或通过接口callback pattern)。这样可以避免在片段准备好之前调用loadText的任何更改。

答案 1 :(得分:0)

您可以使用类似

访问YourActivity的任何公共方法

.new-hr{ width: 20% }

只有谁附加到YourActivity

答案 2 :(得分:-1)

您可以使用该活动的上下文调用Activity方法,例如:

((MainActivity)context).updateWishlistCount();

希望这能帮到你!