我想将片段动态添加到布局中。 但在屏幕旋转时,片段会再次添加到先前片段的顶部。

旋转前的图像

旋转后的图像

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/title_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/quote_fragment_container"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

</LinearLayout>

主要活动:

package course.examples.Fragments.DynamicLayout;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import course.examples.Fragments.DynamicLayout.TitlesFragment.ListSelectionListener;

public class QuoteViewerActivity extends Activity implements
ListSelectionListener {

public static String[] mTitleArray;
public static String[] mQuoteArray;

private final QuotesFragment mQuoteFragment = new QuotesFragment();
private FragmentManager mFragmentManager;
private FrameLayout mTitleFrameLayout, mQuotesFrameLayout;

private static final int MATCH_PARENT = LinearLayout.LayoutParams.MATCH_PARENT;
private static final String TAG = "QuoteViewerActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {

Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()");

super.onCreate(savedInstanceState);

mTitleArray = getResources().getStringArray(R.array.Titles);
mQuoteArray = getResources().getStringArray(R.array.Quotes);

setContentView(R.layout.main);

mTitleFrameLayout = (FrameLayout) findViewById(R.id.title_fragment_container);
mQuotesFrameLayout = (FrameLayout) findViewById(R.id.quote_fragment_container);

mFragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.title_fragment_container,
new TitlesFragment());
fragmentTransaction.commit();

mFragmentManager
.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
setLayout();
}
});
}

private void setLayout() {
if (!mQuoteFragment.isAdded()) {
mTitleFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(
MATCH_PARENT, MATCH_PARENT));
mQuotesFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT));
} else {
mTitleFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT, 1f));
mQuotesFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT, 2f));
}
}

@Override
public void onListSelection(int index) {
if (!mQuoteFragment.isAdded()) {
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.quote_fragment_container,
mQuoteFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
mFragmentManager.executePendingTransactions();
}
if (mQuoteFragment.getShownIndex() != index) {
mQuoteFragment.showIndex(index);
}
}

@Override
protected void onDestroy() {
Log.i(TAG, getClass().getSimpleName() + ":entered onDestroy()");
super.onDestroy();
}

@Override
protected void onPause() {
Log.i(TAG, getClass().getSimpleName() + ":entered onPause()");
super.onPause();
}

@Override
protected void onRestart() {
Log.i(TAG, getClass().getSimpleName() + ":entered onRestart()");
super.onRestart();
}

@Override
protected void onResume() {
Log.i(TAG, getClass().getSimpleName() + ":entered onResume()");
super.onResume();
}

@Override
protected void onStart() {
Log.i(TAG, getClass().getSimpleName() + ":entered onStart()");
super.onStart();
}

@Override
protected void onStop() {
Log.i(TAG, getClass().getSimpleName() + ":entered onStop()");
super.onStop();
}

}

源代码来自: https : //github.com/aporter/coursera-android/tree/master/Examples/FragmentDynamicLayout

===============>>#1 票数:3 已采纳

这是因为每次旋转屏幕时,都会重新创建您的活动,即再次调用onCreate() 由于您是在onCreate中创建片段,因此每次都会创建一个新片段,并且前一个片段不会被破坏。

为了解决这个问题,您可以使用savedInstanceState保存活动的状态,也许保存一个布尔值,说明该片段已创建一次,然后在onCreate检查它是否创建该片段。

  ask by mrd abd translate from so

未解决问题?本站智能推荐:

1回复

动态添加多个片段

我正在考虑一个应用程序,在该应用程序中,我将能够根据存储在某处的元数据以编程方式显示一些片段。 据我所知,每个片段都位于相应的FrameLayout中,或者特别是当我使用一个FrameLayout创建活动时,无论哪种类型,我一次只能在其中存储一个片段。 但是,问题在于,当我的元数据声明时,我
1回复

在我的活动中动态添加片段

我正在使用片段,当我在左侧片段上选择某项时,我希望通过我的主要活动创建一个右侧片段。 所以我这样做是将片段添加到FrameLayout上: 但是我得到这个错误: 我是否必须先删除FrameLayout视图? 还是其他观点? 怎么做?
1回复

当在片段旁边添加另一个片段时,缩放片段(FrameLayout)

我有一个包含ExpandableListView的片段。 现在,当单击一个孩子时,我想在ListView旁边添加另一个片段。 ListView应该缩放,以便新的片段正确适合。 这是我的布局: 我添加列表片段是这样的: 然后在子项上单击我添加另一个片段: 添加另一
2回复

动态地在FrameLayout中添加多个片段

我正在尝试使用FragmentTransaction的add()方法将正在创建的多个片段动态地添加到帧布局中。 每次我尝试这样做时,Fragments都在相互替换。 这是我的代码: 这是FragmentMerchandPresentation的代码: 这是fragment
4回复

处理屏幕上的片段重复旋转(带示例代码)

有一些类似的答案,但不是这种情况。 我的情况很简单。 我有一个具有两种不同布局的活动,一个在Portrait中,另一个在Landscape中。 在Portrait中 ,我使用<FrameLayout>并动态地将Fragment添加到其中。 在Landscap
3回复

试图将片段添加到我的片段容器FrameLayout

我创建了一个名为editor.xml的xml文件,其中包含一个FrameLayout。 在我的主要活动中,我正在尝试将自定义片段添加到FrameLayout中。 我在尝试添加片段时收到的错误是: FragmentTransaction类型中的方法add(int,Fragment)不
1回复

屏幕旋转后保留片段

我认为stackoverflow已经有很多这样的话题,但是我还是听不懂。 问题是,当屏幕旋转且互联网不活动时,我想保留片段及其数据。 所以场景是: 加载主要活动 关闭网路 旋转屏幕 检查数据是否仍然存在 我的代码的问题是,当用户旋转屏幕并且互
1回复

将片段添加到frameLayout:无法找到资源ID

我必须在其中放入3个frameLayout动画,但必须使用片段,但是我使用的方法不起作用。 我在哪里做错了? MenuActiviyt.java ThreeLayout.java 该片段未显示。
2回复

Android Activity有两个片段:如何告诉系统要将片段添加到哪个FrameLayout?

假设FragmentActivity应该具有两个不同的Fragment (并排放置,其中右侧的长度是左侧的宽度的两倍),并将动态添加它们。 我们如何告诉系统哪个Fragment进入哪个FrameLayout ? 如果它是Activity中的单个Fragment ,我将简单地重写onC
1回复

如何在运行时将两个片段一起添加到frameLayout中

我正在开发带有navigation drawer的andorid应用程序,并且我有一个contentview的布局,如下所示: 因此,我可以在导航抽屉项目单击上添加和替换片段。 到现在一切都还好。 但是在一种情况下,单击导航抽屉上的某个项目时,我需要显示两个片段而不是一个片段(就