Android Fragment,视图未删除

Jos*_*wan 10 android fragment

我开发了一个应用程序,因为我有一个片段事务,

MainActivity包含Fragment View.

MainActivityButton屏幕上方有三个,当我们将它Activity转到另一个时,它们保持不变Fragment,MainActivity Fragment当我们点击三个时,只有部分更改.

但是,我的问题是,当我从这个移动MainActivityFragment点击时First-Button没关系,但是当我点击时Second-Button,结果会首先覆盖屏幕Fragment到另一个屏幕Fragment.

它是一样的Activity,我无法Fragment通过remove(fr).commit();

因为如果我这样做那么它变得不可点击可能是片段删除所以没有响应点击下一个按钮.

总体结果,当我移动到如何移除屏幕时,它显示FirstFragment和屏幕?NewFragmentNewFragmentFirstFragment

MainActivity三个按钮中有以下代码来更改片段:

主要活动 :

 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();                                                                 
    }                                                                                                 
 });    
Run Code Online (Sandbox Code Playgroud)

它的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/>
Run Code Online (Sandbox Code Playgroud)

第一片段:

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;
    }
}    
Run Code Online (Sandbox Code Playgroud)

第二片段:

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;
    }
}    
Run Code Online (Sandbox Code Playgroud)

但是当点击一个按钮Fragment按钮到另一个按钮时,它会显示第一个和第二个Fragment屏幕.

那么如何解决它以及如何在第二次点击时删除第一个视图?

我用过这个

fragmentTransaction.remove(fr).commit();
Run Code Online (Sandbox Code Playgroud)

还有这个

getFragmentManager().beginTransaction().remove(fr).commit();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

Bla*_*elt 14

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"/> 
Run Code Online (Sandbox Code Playgroud)

使用您选择的a FrameLayout或子类ViewGroup,并以编程方式处理所有事务.剩下的对我来说很好看


Rav*_*bra 5

最好使用 viewGroup 或布局/FrameLayout 而不是片段(在 Activity 中单击按钮时的片段导航)。因为片段有自己的生命周期,片段持有它们的视图,或者在活动中进行片段转换时不会被杀死。

尽管如果您仍然想要使用片段,请首先加载第一次按钮单击的片段并通过删除先前附加的片段(附加到第一次按钮单击的片段)来处理其他两个按钮的单击事件。

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

getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以编写代码在此位置添加片段, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();因此这也可以用于您的第三个按钮单击,只需要更改附加到第二个按钮的片段。

我希望这能帮到您。