Android force Fragment重建View

Chr*_*ris 14 android view fragment layout-inflater

我有一个简单的应用程序有两个片段,当处于横向模式时,两个片段并排显示,并在纵向我显示片段A,然后如果他们选择一个选项,启动一个显示片段B的活动.我的问题是当我我处于纵向模式并显示片段B,如果用户选择了一个菜单选项,我想要刷新或重绘与片段B关联的视图,并且无法理解如何使其工作.我尝试了getView方法和getLayoutInflater方法,但屏幕没有改变,因为我认为我正在创建一个新视图.我还试图获得对Fragment A的引用,我认为我可以调用它的例程来构建一个新的片段并替换Fragment B但是因为它没有被显示而无法获得对它的引用.我真正需要做的是强制再次调用onCreateView方法来为新视图充气,但我尝试了几种方法来尝试这样做,但是无法再次调用onCreateView.有什么想法怎么样?

小智 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);
}
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您的菜单是其中一个片段的子节点(它应该是为了更可重用的代码),那么一种方法是要求宿主Activity实现Fragment定义的接口,可以用作回电话.在onOptionsItemSelected()fragment类中的回调中,您只需调用此回调方法即可.

虽然听起来像是满口,但你真的只需要做几件事.假装这是你的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);
}
}
...
}
Run Code Online (Sandbox Code Playgroud)

然后在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();
}
}
Run Code Online (Sandbox Code Playgroud)

  • 当您替换R.id.your_fragment_id时,您假设它是以XML格式声明的.但是,如果我的原始片段是以编程方式构建的呢? (7认同)

Com*_*are 1

\n

如果用户选择一个菜单选项,我想刷新或重绘与片段 B 关联的视图,并且 can\xe2\x80\x99t 了解如何进行此工作

\n
\n\n

在 中onOptionsItemSelected(),让活动调用片段上的方法,使其使用新内容更新其小部件。或者,让活动执行 aFragmentTransaction来替换片段(如果片段最初是通过 a 设置的FragmentTransaction)。

\n