Проблема с изменением фрагмента в FragmentManager

New Layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/L1" >
        
        <fragment
            android:id="@+id/fragment_place"
            android:name="com.javacodegeeks.android.fragmentstest.HomeFrag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        
   </FrameLayout>     

    <RelativeLayout
        android:id="@+id/L1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >
        
     
       <ImageView
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/home"
            android:onClick="selectFrag"
            android:layout_alignParentLeft="true"/>
        
         <ImageView
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/search"
            android:onClick="selectFrag"
            android:layout_toRightOf="@+id/button1"/>
         
           <ImageView
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/map"
            android:onClick="selectFrag"
            android:layout_toRightOf="@+id/button2"/>
         
         
    
    
    </RelativeLayout>

</RelativeLayout>

Я учусь изменять фрагменты при нажатии ImageView с помощью FragmentManager. Когда я нажимаю 1-й imageView, макет основного фрагмента с текстом «дом» показывает хорошо. Но когда щелчок по другому ImageViews для изменения страницы фрагмента, он меняется на новую страницу фрагмента, но без удаления предыдущей страницы. В результате предыдущая страница смешивается с новой страницей. Это выглядит так. На снимке экрана показана домашняя страница с текстом "home", который является предыдущая страница и новая страница с текстом "поиск". Как удалить предыдущую страницу при нажатии нового ImageView?

MainActivity

public class MainActivity extends Activity {
	
	private static final int RESULT_SETTINGS = 1;


	@Override
	protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.demo);
      
    
      
	}
	
	
	 
	public void selectFrag(View view) {
		 Fragment fr = null;
		 
		 if(view == findViewById(R.id.button1)) {
			 fr = new HomeFrag();
		 
		 }else if(view == findViewById(R.id.button2)){
			 fr = new SearchFrag();
		 
		 }else if(view == findViewById(R.id.button3)){
			 fr = new MapFrag();
		 
		 }
		 
		 FragmentManager fm = getFragmentManager();
	     FragmentTransaction fragmentTransaction = fm.beginTransaction();
	     fragmentTransaction.replace(R.id.fragment_place, fr);
	     fragmentTransaction.commit();
		 
	}
	
	
	
	
	
	
	
	
   
}


person Sammy    schedule 30.12.2015    source источник
comment
Используйте фрагмент внутри фрейма, прочитайте этот ответ   -  person Zeeshan Shabbir    schedule 30.12.2015


Ответы (3)


как сказано в руководстве Android по запуску фрагментов. Не используйте элемент fragment в вашем файле макета, когда вы хотите, чтобы фрагмент изменился. вы должны использовать какой-то макет, например FrameLayout

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

Я думаю, что это то, что вызывает ваши проблемы.


Ваш новый макет XML близок, но я имел в виду это ВМЕСТО использования <fragment> вообще.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_place"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</FrameLayout>  

Затем в самом коде еще многое предстоит сделать, потому что вам нужно будет создать/прикрепить «домашний» фрагмент при первом создании пользовательского интерфейса.

внутри твоего public void onCreate(Bundle savedInstanceState) {

добавьте это, чтобы создать/прикрепить первый «домашний» фрагмент.

 if (findViewById(R.id.fragment_place) != null) {

        // However, if we're being restored from a previous state,
        // then we don't need to do anything and should return or else
        // we could end up with overlapping fragments.
        if (savedInstanceState != null) {
            return;
        }

        // Create a new Fragment to be placed in the activity layout
        HomeFrag firstFragment = new HomeFrag();

        // In case this activity was started with special instructions from an
        // Intent, pass the Intent's extras to the fragment as arguments
        //   firstFragment.setArguments(getIntent().getExtras());
        // I commented this out since you don't appear to need it right now.

        // Add the fragment to the 'fragment_container' FrameLayout
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();
    }
person mawalker    schedule 30.12.2015
comment
stackoverflow.com/a/17495250/2801237 вот хорошее объяснение того, почему вы должны использовать макет кадра. - person mawalker; 30.12.2015
comment
Я добавил FrameLayout и вставил в него фрагмент, но проблема все еще существует. Я отредактировал код макета в своем посте. @мауокер - person Sammy; 30.12.2015
comment
Огромное спасибо. Он работает абсолютно нормально. @мауокер. - person Sammy; 30.12.2015

Оберните с помощью framelayout. Попробуйте этот xml

Объяснение здесь

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Framelayout
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <fragment
        android:id="@+id/fragment_place"
        android:name="com.javacodegeeks.android.fragmentstest.HomeFrag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/L1" />
  </framelayout>
<RelativeLayout
    android:id="@+id/L1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >


   <ImageView
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/home"
        android:onClick="selectFrag"
        android:layout_alignParentLeft="true"/>

     <ImageView
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/search"
        android:onClick="selectFrag"
        android:layout_toRightOf="@+id/button1"/>

       <ImageView
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/map"
        android:onClick="selectFrag"
        android:layout_toRightOf="@+id/button2"/>




</RelativeLayout>

person Zeeshan Shabbir    schedule 30.12.2015
comment
Я изменил корневой макет на framelayout, но все равно не очень хорошо. @Зишан - person Sammy; 30.12.2015

Попробуйте этот фрагмент кода, который будет работать

        FragmentManager fm = getFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        Fragment currentFragment =   getSupportFragmentManager().findFragmentById(R.id.fragment_place);
        if(currentFragment!=null)
            fragmentTransaction.remove()
        else{
            fragmentTransaction.add(R.id.fragment_place, fr);
            `enter code here`
            fragmentTransaction.commit();
        }
person Shailendra Sachan    schedule 30.12.2015