Android碎片,视图不会被删除

我开发了一个应用程序,我有一个片段交易,

MainActivity包含Fragment View

MainActivity在屏幕上方有三个Button ,当我们将这个Activity到另一个Fragment时,它们保持不变,只有MainActivity Fragment部分在我们点击三下时发生变化。

但是,我的问题是,当我从这个MainActivity移动到Fragment当点击First-Button是好的,但是当我点击Second-Button ,结果是覆盖屏幕与第一个Fragment到另一个Fragment

它是在同一个Activity所以我不能通过remove(fr).commit();去掉Fragment remove(fr).commit();

因为如果我这样做,那么它成为不可点击的可能是片段删除所以不响应点击下一个button。

整体结果,它显示FirstFragmentNewFragment屏幕,当我移动到NewFragment如何删除FirstFragment屏幕?

MainActivity三个button有以下代码来改变片段:

主要活动 :

  public class MasterActivity extends Activity { ImageView imgOne, imgTwo, imgThree; Fragment fr; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_master); imgOne = (ImageView) findViewById(R.id.imgOne); imgTwo = (ImageView) findViewById(R.id.imgTwo); imgThree = (ImageView) findViewById(R.id.imgThree); imgOne.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub fr = new FirstFragment(); FragmentManager fm = getFragmentManager(); FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, fr); fragmentTransaction.addToBackStack(null); //fragmentTransaction.remove(fr).commit(); //getFragmentManager().beginTransaction().remove(fr).commit(); fragmentTransaction.commit(); } }); imgTwo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub fr = new SecondFragment(); FragmentManager fm = getFragmentManager(); FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, fr); fragmentTransaction.addToBackStack(null); //fragmentTransaction.remove(fr).commit(); // getFragmentManager().beginTransaction().remove(fr).commit(); fragmentTransaction.commit(); } }); 

它的XML文件如下所示:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#000000" android:gravity="bottom" android:weightSum="3" > <ImageView android:id="@+id/imgOne" android:layout_width="0dp" android:layout_height="27dp" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/img1" /> <ImageView android:id="@+id/imgTwo" android:layout_width="0dp" android:layout_gravity="center" android:layout_height="27dp" android:layout_weight="1" android:src="@drawable/img2"/> <ImageView android:id="@+id/imgThree" android:layout_width="0dp" android:layout_gravity="center" android:layout_height="27dp" android:layout_weight="1" android:src="@drawable/img3" /> </LinearLayout> <fragment android:id="@+id/fragment_place" android:name="packagename.FirstFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.87"/> <LinearLayout/> <LinearLayout/> 

第一片段:

 public class FirstFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View r = inflater.inflate(R.layout.first_fratgment, container, false); return r; } } 

第二个片段:

 public class SecondFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View r = inflater.inflate(R.layout.second_fratgment, container, false); return r; } } 

但是当点击一个buttonFragmentbutton到另一个时,它将同时显示第一个和第二个Fragment屏幕。

那么如何解决它,以及如何删除第一次查看时,第二次点击?

我用这个

 fragmentTransaction.remove(fr).commit(); 

和这个

 getFragmentManager().beginTransaction().remove(fr).commit(); 

但它不工作。

Solutions Collecting From Web of "Android碎片,视图不会被删除"

Android中对布局中声明的碎片进行了不同的处理。 更换

  <fragment android:id="@+id/fragment_place" android:name="packagename.FirstFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.87"/> 

与一个FrameLayout ,或您select的ViewGroup的子类,并以编程方式处理所有交易。 其余的看起来不错

它更好地使用viewGroup或布局/ FrameLayout而不是片段(在活动中的button点击片段导航)。 因为片段拥有自己的生命周期,并且片段可以保持其视图,或者在活动中执行片段转换时不会被终止。

虽然如果你仍然想要使用片段,首先加载第一个button点击的片段,并通过删除以前附加的片段(片段附加到第一个button单击)来处理其他两个button的点击事件。

这可以通过以下方式完成:

 getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit(); 

在这之后你可以编写一个代码在这个地方添加fragment, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit(); 因此这也可以为你的第三个button点击,只需要改变连接到第二个button的片段。

我希望这能帮到您。

硬编码为XML的片段不能被replace。 改为使用FramLayout作为片段容器。

在你的XMLreplace

 <fragment android:id="@+id/fragment_place" android:name="packagename.FirstFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.87"/> <LinearLayout/> 

 <FrameLayout android:id="@+id/contentFragment" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="2" /> 

现在,请遵循以下代码风格来实现您的目标:

首先将imgOne.setOnClickListener(this);设置为所有的imgOne.setOnClickListener(this);如: imgOne.setOnClickListener(this);

  @Override public void onClick(View v) { Fragment fragment = null; switch (v.getId()) { case R.id.imgOne: fragment = new Fragment1(); break; case R.id.imgTwo: fragment = new Fragment2(); break; } if (fragment != null) { FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction().replace(R.id.contentFragment, fragment).commit(); } else { Log.e(LOG_TAG, "Error in fragment transaction."); } } 

希望这可以帮助。

你可以使用: getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 希望这会有所帮助。

进行必要的更改。 用这个replace你的活动和xml。 它应该运行稳定,如果你这样做。

 public class MasterActivity extends Activity { ImageView imgOne, imgTwo, imgThree; Fragment fr; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_master); imgOne = (ImageView) findViewById(R.id.imgOne); imgTwo = (ImageView) findViewById(R.id.imgTwo); imgThree = (ImageView) findViewById(R.id.imgThree); getFragmentManager().beginTransaction().add(R.id.fragment_place, new FirstFragment()).commit(); imgOne.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getFragmentManager().beginTransaction().replace(R.id.fragment_place, new FirstFragment()).commit(); } }); imgTwo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getFragmentManager().beginTransaction().replace(R.id.fragment_place, new SecondFragment()).commit(); } }); 

XML

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#000000" android:gravity="bottom" android:weightSum="3" > <ImageView android:id="@+id/imgOne" android:layout_width="0dp" android:layout_height="27dp" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/img1" /> <ImageView android:id="@+id/imgTwo" android:layout_width="0dp" android:layout_gravity="center" android:layout_height="27dp" android:layout_weight="1" android:src="@drawable/img2"/> <ImageView android:id="@+id/imgThree" android:layout_width="0dp" android:layout_gravity="center" android:layout_height="27dp" android:layout_weight="1" android:src="@drawable/img3" /> </LinearLayout> <FrameLayout android:id="@+id/fragment_place" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.87"/> <LinearLayout/> <LinearLayout/> 

当我移动到NewFragment如何删除第一个Frament屏幕?

那么你可以通过隐藏旧的(第一个) Fragment 源来做到这一点

 getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager() .findFragmentById(R.id.the_id_of_my_first_fragment)); 

你也可以通过相同的方法来获取他(第一个片段)

 getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager() .findFragmentById(R.id.the_id_of_my_first_fragment)); 

这种方法购买灵活性,而不是重新改变你的应用程序的体系结构,逻辑和一行工作

我总是迟到派对(:

在你的button点击事件复制和虫害代码。

 fr = new FirstFragment(); fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, fr); fragmentTransaction.commit(); 

这是完成的工作。