我目前正在开发一个有两个片段的应用程序。下面的片段是一个导航轮,所以永远不会改变,但是当用户改变下面片段的模式时,上面的片段会改变。我遇到的问题是,当我使用滚轮更改模式时,会将新视图添加到层次结构中,但不会删除旧视图,新添加的视图也包含在 FrameLayout 中,而我没有在任何地方定义。
这是我在活动的 onCreate 中的代码
随机活动.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.root);
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
modeFragment = new LottoModeFragment();
wheelFragment = new WheelFragment();
fragmentTransaction.add(R.id.mode_view, modeFragment);
fragmentTransaction.add(R.id.wheel_view, wheelFragment);
fragmentTransaction.commit();
}
这是我用来切换片段的代码
随机活动.java
private void switchFragments(ModeFragment fragment){
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.mode_view, fragment);
fragmentTransaction.commit();
}
这是声明两个片段的两个占位符的根视图
根.xml
<org.random.wheel.RootView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:contentDescription="@string/root_desc"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/root_background">
<FrameLayout
android:id="@+id/mode_view"
android:contentDescription="@string/mode_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/wheel_view"
android:contentDescription="@string/wheel_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</org.random.wheel.RootView>
在我的片段中(我想最终有很多不同的模式,但我目前只有两个)我在 onCreateView 中执行此操作
LottoModeFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
modeView = (LottoModeView) inflater.inflate(R.layout.lotto_mode, container, false);
return modeView;
}
为了更好地说明正在发生的事情,请查看 hierachyviewer 中的这些屏幕截图
这显然很烦人,而不是它应该如何工作。如何摆脱作为添加视图的父级的冗余 FrameLayout?以及如何让 Android 实际上用另一个片段替换一个片段,而不仅仅是添加它?
类似的问题似乎只发生在片段在 xml 中声明时,但正如您所见,我的片段是用 java 代码制作的。例如这里
还。我正在使用支持包。
提前致谢。
编辑
根据要求包括 ModeView.java:
模式视图.java
public class ModeView extends RelativeLayout{
private RandomActivity activity;
private AppDisplaySizeInterface appDisplay;
public ModeView(Context context, AttributeSet attrs) {
super(context, attrs);
activity = (RandomActivity) getContext();
}
private void applyRoundedCorners(){
int width = (int) activity.getAppDisplaySizes().getModeWidth();
int height = (int) activity.getAppDisplaySizes().getModeHeight();
Bitmap original = Conversion.drawableToBitmap(this.getBackground(), width, height);
float radius = Float.parseFloat(getResources().getString(R.string.rounded_corner_radius));
RoundedCorners rounded = new RoundedCorners(original, radius, 0);
this.setBackgroundDrawable(rounded);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
appDisplay = activity.getAppDisplaySizes();
super.onMeasure(MeasureSpec.makeMeasureSpec((int) appDisplay.getModeWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec((int) appDisplay.getModeHeight(), MeasureSpec.EXACTLY));
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
applyRoundedCorners();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}