android 改变方向时改变片段布局

s4n0splo  于 2023-01-15  发布在  Android
关注(0)|答案(3)|浏览(141)

我有以下问题:
我有一个TabActivity,它在其中一个选项卡中显示了一个FragmentActivity
FragmentActivity添加了ListFragment,当点击ListFragment的项目时,片段被添加(也添加到backstack)并显示。
现在我需要更改Fragment的布局,以便在切换到横向时进行更改。
但是我完全不知道在哪里实现这个改变。我已经在layout-land文件夹中创建了正确的布局。但是在哪里设置它是正确的呢?

pobjuy32

pobjuy321#

您需要两个不同的xml设计,它们在res包下的layoutlayout-land包中具有相同的名称。
当方向发生变化时,覆盖***onConfigurationChanged()***函数,并按如下所示编辑该函数,以加载适合该方向的xml文件。

override fun onConfigurationChanged(newConfig: Configuration) {
        val fragmentManager: FragmentManager = requireActivity().supportFragmentManager
        fragmentManager.beginTransaction().detach(this).commitAllowingStateLoss()
        super.onConfigurationChanged(newConfig)
        fragmentManager.beginTransaction().attach(this).commitAllowingStateLoss()
}
pbpqsu0x

pbpqsu0x2#

**警告:**这可能是Lollipop之前的答案。

Fragment不会在配置更改时重新膨胀,但您可以通过使用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()和相关调用不是特别满意,但我认为没有其他方法可以获得这些东西。

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

wvmv3b1j

wvmv3b1j3#

我相信如果你有针对特定设备方向的布局,那么你所需要做的就是给予它们相同的名称,但是把它们放在合适的资源目录中。This link给出了一些解释。Android系统会负责选择合适的资源,但是如果需要的话,你可以自己处理。

相关问题