Android强制Fragment重建View

Posted

技术标签:

【中文标题】Android强制Fragment重建View【英文标题】:Android force Fragment to rebuild View 【发布时间】:2011-12-09 11:07:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您需要执行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);


或者,如果您的菜单是您的 Fragment 之一的子项(应该是为了更多可重用代码),那么一种方法是要求该主机 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();


【讨论】:

当您替换 R.id.your_fragment_id 时,您假设它是在 XML 中声明的。但是,如果我的原始片段是以编程方式构建的呢? @IgorGanapolsky 这将是该片段容器的 ID【参考方案2】:

如果用户选择了一个菜单选项,我想刷新或重绘与 Fragment B 关联的 View,但不知道如何进行此操作

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

【讨论】:

以上是关于Android强制Fragment重建View的主要内容,如果未能解决你的问题,请参考以下文章

Navigation+BottomNavigationView实现的tab效果重建fragment问题

Navigation+BottomNavigationView实现的tab效果重建fragment问题

Navigation+BottomNavigationView实现的tab效果重建fragment问题

Navigation+BottomNavigationView实现的tab效果重建fragment问题

Android横屏下Fragment界面重叠问题

Android ImageAdapter 与 Fragment 中的 Gridview