Фрагмент Android, просмотр не удаляется

Я разработал приложение, в котором у меня есть транзакция фрагмента,

MainActivity содержит Fragment View.

MainActivity имеют три Button поверх экрана, которые остаются такими же, когда мы переходим этот Activity к другому Fragment, только часть MainActivity Fragment изменяется, когда мы выходим из трех.

Но, моя проблема в том, что когда я перехожу от этого MainActivity в Fragment, когда нажимаю на First-Button, это нормально, но когда я нажимаю на Second-Button, результат перезаписывает экран с помощью первого Fragment к другому Fragment.

он находится в одном и том же Activity, поэтому я не могу удалить Fragment через remove(fr).commit();

Потому что, если я это сделаю, тогда он станет не кликабельным, может быть снят фрагмент, поэтому не будет отвечать на нажатие следующей кнопки.

общий результат. Отображается экран FirstFragment и NewFragment, когда я перехожу на 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();

но он не работает.

Ответ 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). Поскольку фрагменты имеют свой собственный жизненный цикл и фрагмент, удерживают их или не убивают, когда вы выполняете переход фрагмента внутри действия.

Хотя если вы все еще хотите пойти с фрагментом, сначала загрузите фрагмент первой кнопки мыши и обработайте события щелчка других двух кнопок, удалив ранее прикрепленный фрагмент (Фрагмент прикреплен к первому нажатию кнопки).

Это можно сделать:

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, как я удаляю первый экран frament?

Хорошо, вы можете это сделать, скрыв старый (первый) Fragment

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

Этот подход обеспечивает гибкость и не изменяет архитектуру вашего приложения и логику, а также одну строку работы

im всегда опаздывает на вечеринку (:

Ответ 7

код копирования и вредителя в событии нажатия кнопки.

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

завершена работа.