你想做的事情相当复杂。Android Fragments 不应该被旋转。
我有同样的问题,并找到了解决方案。在我的情况下,我想呈现一个包含不同菜单页面的 Fragment,这些页面将根据方向进行旋转。
只需创建一个作为基础的 Fragment,并包含一个简单的 LinearLayout(或任何其他布局类型)。这个 LinearLayout 将用作我们菜单的画布:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llMenuCanvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
接下来,我们希望将基础项片段编码为一个抽象类,由所有菜单项片段实现:
public abstract class NavMenuItem extends Fragment {
static final String TAG = "yourTag";
LinearLayout canvas;
View hView;
View vView;
abstract int getVerticalLayoutResource();
abstract int getHorizontalLayoutResource();
abstract void setupUI();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.menu_base, container, false);
hView = inflater.inflate(getHorizontalLayoutResource(), container, false);
vView = inflater.inflate(getVerticalLayoutResource(), container, false);
canvas = view.findViewById(R.id.llMenuCanvas);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
canvas.addView(hView);
}else{
canvas.addView(vView);
}
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupUI();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
canvas.removeAllViews();
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
canvas.addView(hView);
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
canvas.addView(vView);
}
setupUI();
}
}
这是一个菜单项片段的示例,根据设备的方向进行旋转。
public class NavMenuMain extends NavMenuItem{
static final String TAG = "yourTag";
ImageButton btnCloseMenu;
@Override
int getVerticalLayoutResource() {
return R.layout.menu_main_port;
}
@Override
int getHorizontalLayoutResource() {
return R.layout.menu_main_land;
}
@Override
void setupUI(){
}
}
希望它有所帮助。