我有一个简单的应用程序有两个片段,当处于横向模式时,两个片段并排显示,并且在纵向中我显示片段A然后如果他们选择一个选项,则启动显示片段B的活动。我的问题当我处于纵向模式并显示片段B时,如果用户选择了一个菜单选项,我想要刷新或重绘与片段B相关联的视图,并且无法理解如何使其工作。我尝试了getView方法和getLayoutInflater方法,但屏幕没有改变,因为我认为我正在创建一个新视图。我还试图获得对Fragment A的引用,我认为我可以调用它的例程来构建一个新的片段并替换Fragment B但是因为它没有被显示而无法获得对它的引用。我真正需要做的是强制再次调用onCreateView方法来为新视图充气,但我尝试了几种方法来尝试这样做,但是无法再次调用onCreateView。对此怎么想?
答案 0 :(得分:9)
您需要执行FragmentTransaction
并使用replace()
方法
这不应该太难做,但答案将取决于您的菜单所在的位置(即您的父级活动中的onOptionsItemSelected()
回叫还是在片段A / B中?) 。
为简单起见,假设您的菜单实现和onOptionsItemSelected()
在父活动中,并且您希望在选择menu_option1的情况下重新整形片段。它看起来像这样:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
或者,如果你的菜单是你的一个片段的子节点(它应该是为了更可重用的代码),那么一种方法是要求host Activity实现Fragment定义的接口,即用作回电。
在片段类中的onOptionsItemSelected()
回调中,您只需调用此回调方法。
虽然听起来像是满口,但你真的需要做几件事。假装这是你的Fragment类
public static class FragmentA extends ListFragment {
OnSelectedListener mListener;
// Container Activity must implement this interface
public interface OnSelectedListener {
public void onSelected();
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//This is to ensure that the Activity has implemented the interface we set up above
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnSelectedListener");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
getActivity().onSelected();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
然后在Activity中,你会看到类似的内容:
public class MainActivity extends Activity implements FragmentA.onSelectedListener{
...
public void onSelected(){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
答案 1 :(得分:1)
如果用户选择了一个菜单选项,我想刷新或重绘与片段B相关联的视图,并且无法理解如何使其工作
在onOptionsItemSelected()
中,让活动在片段上调用一个方法,使其使用新内容更新其小部件。或者,让活动执行FragmentTransaction
来替换片段(如果片段最初是通过FragmentTransaction
设置的)。