Android,如何从FragmentActivty重新启动/刷新片段?

Android,如何从FragmentActivty重新启动/刷新片段?,android,fragment,Android,Fragment,在我的碎片活动中,我有一个碎片。此片段从服务器加载数据。 我希望用户单击刷新按钮,然后调用片段中的一个方法并执行刷新过程 我在FragmentActivity中创建了一个界面,并在用户单击刷新按钮时设置其变量。代码如下所示: public class MainScreen extends FragmentActivity { public interface OnRefreshSelected { public void refreshFragment(boolean f

在我的碎片活动中,我有一个碎片。此片段从服务器加载数据。 我希望用户单击刷新按钮,然后调用片段中的一个方法并执行刷新过程

我在FragmentActivity中创建了一个界面,并在用户单击刷新按钮时设置其变量。代码如下所示:

public class MainScreen extends FragmentActivity {
    public interface OnRefreshSelected {
        public void refreshFragment(boolean flag);
    }

    private OnRefreshSelected onRefreshSelected;

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Log.i(TAG, "Try to create MainScreen...");

            setContentView(R.layout.activity_main);

        onRefreshSelected = (OnRefreshSelected) MainScreen.this;
    }

     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                    case R.id.menu_refresh:
                        onRefreshSelected.refreshFragment(true);
                        return true;
                    default:
                        return super.onOptionsItemSelected(item);
        }
    }
}
在Fragment类中,我实现了这个接口:

public class CategoryFragment extends Fragment implements OnRefreshSelected {
    @Override
    public void refreshFragment(boolean flag) {
        Log.i(TAG, "refresh requested. Try to reload data for this fragment...");

        getData();
    }
} 
当我运行时,应用程序崩溃,logcat显示以下消息:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.astro.recipe.activities/com.astro.recipe.activities.MainScreen}: java.lang.ClassCastException: com.astro.recipe.activities.MainScreen
并指向这条线:

onRefreshSelected = (OnRefreshSelected) MainScreen.this;
从宿主访问片段方法的最佳方式是什么? 如有任何建议,将不胜感激。感谢执行此操作

onRefreshSelected = (OnRefreshSelected) MainScreen.this;
您正在
onRefreshSelected
字段中分配活动,试图将其强制转换到您的接口,但您的活动没有实现接口,这就是引发
ClassCastException
的原因

相反,使用这样的东西

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                case R.id.menu_refresh:
                    CategoryFragment fragment = (CategoryFragment) getFragmentManager()
                        .findFragmentById(R.id.category_fragment);
                    if (fragment != null) {
                        fragment.getData();
                    }
                    return true;
                default:
                    return super.onOptionsItemSelected(item);
    }

您的活动可以通过使用或从FragmentManager获取对片段的引用来调用片段中的方法。

我同意biegleux。。。但我的建议是

public class CategoryFragment extends Fragment{

   private static CategoryFragment categoryFrag;

    private CategoryFragment(){}

    public static CategoryFragment getInstance(){
        if(null == categoryFrag){
            categoryFrag = new CategoryFragment();
        }

        return categoryFrag;
    }

    public void  getData(){
       /*** Screen Refresh code****/
    }
} 
当他选择选项时,我会激活你的

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                case R.id.menu_refresh:
                    CategoryFragment fragment = CategoryFragment.getInstance();
                     fragment.getData();

                    return true;
                default:
                    return super.onOptionsItemSelected(item);
    }

谢谢,但我更喜欢使用界面。因此,我替换了onRefreshSelected=(onRefreshSelected)MainScreen.this;by onRefreshSelected=新建TopRecipes片段();和onRefreshSelected=newCategoryFragment();现在它工作得很好。再次感谢。请查看我的相关问题:我可以将您的代码用于AppCompatActivity吗。