Android 在方向更改时更改碎片布局

Android 在方向更改时更改碎片布局,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,我有以下问题: 我有一个TabActivity,它在其中一个选项卡中显示了一个FragmentActivity 该FragmentActivity添加了一个ListFragment,当单击该ListFragment的项目时,一个片段被添加(也添加到backbackback)并显示出来 现在,我需要更改片段的布局,以便在转到横向时进行更改 但我完全不知道在哪里实施这一改变。我已经在layout land文件夹中创建了正确的布局。但是正确的设置点在哪里呢?我认为,如果您有针对特定设备方向的布局,那么

我有以下问题:

我有一个
TabActivity
,它在其中一个选项卡中显示了一个
FragmentActivity

FragmentActivity
添加了一个
ListFragment
,当单击该
ListFragment
的项目时,一个片段被添加(也添加到backbackback)并显示出来

现在,我需要更改
片段的布局,以便在转到横向时进行更改


但我完全不知道在哪里实施这一改变。我已经在layout land文件夹中创建了正确的布局。但是正确的设置点在哪里呢?

我认为,如果您有针对特定设备方向的布局,那么您所需要做的就是给它们取一个相同的名称,但将它们放在适当的资源目录中。给出了一些解释。然后,Android系统负责选择合适的资源,但如果需要,您可以自己处理。

警告:这可能是棒棒糖前的答案

片段不会在配置更改时重新膨胀,但您可以通过使用
FrameLayout
创建它并手动(重新)填充它来实现如下效果:

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
        FrameLayout frameLayout = new FrameLayout(getActivity());
        populateViewForOrientation(inflater, frameLayout);
        return frameLayout;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        populateViewForOrientation(inflater, (ViewGroup) getView());
    }

    private void populateViewForOrientation(LayoutInflater inflater, ViewGroup viewGroup) {
        viewGroup.removeAllViewsInLayout();
        View subview = inflater.inflate(R.layout.my_fragment, viewGroup);

        // Find your buttons in subview, set up onclicks, set up callbacks to your parent fragment or activity here.
    }
}
我对这里的
getActivity()
和相关调用不是特别满意,但我认为没有其他方法可以掌握这些东西


更新:删除了
ViewGroup
FrameLayout
的强制转换,并使用了
LayoutInflater.from()
,以及
inflate()
的第三个参数,而不是显式添加视图。

我知道所有这些是如何工作的,但这似乎只适用于活动,而不是片段!是否实现onCreateView方法[在您的Fragment类中没有实现相同的功能?它不会在方向更改时再次被调用,只有一次,但Android不会处理选择适当的布局吗?就像在Activity中一样,您只需设置一次布局,Android就会处理方向更改。如果您想自己处理它,则有OnConfiguration change()片段类中的方法显然不是:(因此建议在onConfigurationChange方法中再次膨胀并填充布局?答案可以接受,但我认为不需要添加FrameLayout,因为您可以使用ViewGroup容器和getView()直接。@Godchen:您是说将“container”对象提供给populateView()而不是新的FrameLayout对象,并在onConfigurationChanged()中提供给它getView().getParent()?这似乎与文档相矛盾:容器:如果非空,则这是片段的UI应附加到的父视图。片段不应添加视图本身,但这可用于生成视图的LayoutParams。这似乎在Android 21中有所更改。似乎片段的布局会自动重新膨胀在旋转时(在这个新的API版本中)。但令人恼火的是,在以前的API版本中没有记录这种缺乏旋转管理的情况,特别是当Google建议使用片段而不是活动时。这个答案非常适用于棒棒糖制作前的设备。这种做法会导致视图侦听器丢失吗?