【问题标题】:Android Fragment , view is not removedAndroid Fragment,视图未删除
【发布时间】:2015-06-29 14:17:57
【问题描述】:

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

MainActivity 包含Fragment View

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

但是,我的问题是,当我从这个MainActivity 移动到Fragment 时,点击First-Button 没问题,但是当我点击Second-Button 时,结果是用第一个@987654333 覆盖屏幕@给另一个Fragment

它在同一个Activity 所以,我不能通过remove(fr).commit(); 删除Fragment

因为如果我这样做,那么它变得不可点击可能会被片段删除,因此在点击下一个按钮时不会响应。

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

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();                                                                 
    }                                                                                                 
 });    

它的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;
    }
}    

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

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

我用过这个

fragmentTransaction.remove(fr).commit();

还有这个

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

但它不起作用。

【问题讨论】:

  • 请发布您的 NewFragment 课程
  • 当然,请参阅编辑后的问题
  • 你不能有一个嵌入的片段(一个在 xml 布局中声明的片段标签),你可以使用它进行交易(如替换)。因此,而不是那个片段标签,而是放置一个简单的 FrameLayout 并在活动的 onCreate() 方法中手动添加片段。
  • @Luksprog :谢谢伙计...你太棒了... :) 这个技巧奏效了... ty ty .....
  • ya @Luksprog 现在它的工作就像魅力... ty...

标签: android fragment


【解决方案1】:

在布局中声明的片段被 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 或您选择的ViewGroup 的子类,并以编程方式处理所有事务。其余的对我来说都不错

【讨论】:

    【解决方案2】:

    最好使用 viewGroup 或 layout/FrameLayout 而不是片段(在 Activity 中单击按钮时的片段导航)。因为 Fragment 有自己的生命周期,并且 Fragment 拥有自己的视图,或者当您在 Activity 中进行 Fragment 转换时不会被杀死。

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

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

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

    然后你可以写一段代码在这个地方添加片段, getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();,因此这也可以在您单击第三个按钮时完成,只需更改附加到第二个按钮的片段。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      在 XML 中硬编码的片段无法替换。 请改用FramLayout 作为片段容器。

      在您的 XML 替换中

      <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" />
      

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

      首先将 onClickListeners 设置为所有图像视图: 喜欢: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.");
                      }
                  }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          进行必要的更改。用这个替换你的活动和 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/>
          

          【讨论】:

            【解决方案6】:

            当我移动到 NewFragment 时,我如何删除第一个框架屏幕?

            你可以通过隐藏旧的(第一)Fragmentsource来做到这一点

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

            你也可以用同样的方法把他(第一个片段)找回来source

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

            这种方法获得了灵活性,并且不会重新更改应用的架构、逻辑以及一条工作线

            我总是迟到一个聚会(:

            【讨论】:

              【解决方案7】:

              在您的按钮点击事件中复制和破坏代码。

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

              这是完成的工作。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-01-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多