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.
}
}
3条答案
按热度按时间pobjuy321#
您需要两个不同的xml设计,它们在res包下的layout和layout-land包中具有相同的名称。
当方向发生变化时,覆盖***onConfigurationChanged()***函数,并按如下所示编辑该函数,以加载适合该方向的xml文件。
pbpqsu0x2#
**警告:**这可能是Lollipop之前的答案。
Fragment
不会在配置更改时重新膨胀,但您可以通过使用FrameLayout
创建它并手动(重新)填充它来实现以下效果:我对这里的
getActivity()
和相关调用不是特别满意,但我认为没有其他方法可以获得这些东西。**更新:**删除了
ViewGroup
到FrameLayout
的强制转换,使用了LayoutInflater.from()
和inflate()
的第三个参数,而不是显式添加视图。wvmv3b1j3#
我相信如果你有针对特定设备方向的布局,那么你所需要做的就是给予它们相同的名称,但是把它们放在合适的资源目录中。This link给出了一些解释。Android系统会负责选择合适的资源,但是如果需要的话,你可以自己处理。