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