2016-08-12 19 views
0

Я хочу заменить FragmentB на FragmentA. Фрагмент A, состоящий из listView и FragmentB, состоит из некоторого TextView. В позиции списка кликов 0 FragmentB должен заменить FragmentA. Перед заменой все два фрагмента выглядели нормально в MainActivity. После замены FragmentA появился на дне FragmentB. Это означает, что содержимое FragmentB не исчезает, но оно должно исчезнуть.Фрагмент заменен не может быть удален

Fragmenta:

public class FragmentA extends ListFragment implements AdapterView.OnItemClickListener { 

    Get get; 
    public interface Get { 
     void getData(int s); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      get = (Get) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString()); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_a, container, false); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ArrayList<String> arrayList = new ArrayList<>(); 
     for(int i = 0; i<10; i++) { 

      arrayList.add("a"); 
     } 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, arrayList); 
     setListAdapter(adapter); 
     getListView().setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 
     get.getData(position); 
    } 
} 

FragmentB:

public class FragmentB extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_b, container, false); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 
} 

MainActivity:

public class MainActivity extends AppCompatActivity implements FragmentA.Get{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public void getData(int s) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     if(s == 0) { 




FragmentA fragment = new FragmentA(); 
     fragmentTransaction.replace(R.id.fragment2, fragment); 
     fragmentTransaction.commit(); 
     Toast.makeText(this, String.valueOf(s), Toast.LENGTH_LONG).show(); 
     } 
    } 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.zohaibsiddique.listfragment.MainActivity"> 

    <fragment 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:name="com.example.zohaibsiddique.listfragment.FragmentA" 
     android:id="@+id/fragment" /> 

    <fragment 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:name="com.example.zohaibsiddique.listfragment.FragmentB" 
     android:id="@+id/fragment2" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/fragment" 
     android:layout_toEndOf="@+id/fragment" /> 
</RelativeLayout> 

fragment_a.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

fragment_b.xml

package com.example.zohaibsiddique.listfragment; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.ListFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 

import java.util.ArrayList; 

/** 
* Created by Zohaib Siddique on 12/08/2016. 
*/ 
public class FragmentB extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_b, container, false); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 
} 
+0

Может быть, прозрачность фона является причиной этой проблемы. –

+0

Вместо добавления 'fragmentTransaction.add (R.id.fragment2, фрагмент);' пытаться заменить как 'fragmentTransaction.replace (R.id.fragment2, фрагмент);' –

+0

, каково будет возможное решение? –

ответ

0

Проблема заключается в макете деятельности. FragmentB находится поверх Фрагмента А. Простым решением этого будет создание LinearLayout в макете активности. Как:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.zohaibsiddique.listfragment.MainActivity"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@id/fragment_container"/> 

</RelativeLayout> 

Тогда в onCreate() деятельности, добавить первый фрагмент:

FragmentA fragmentA = new FragmentA(); 
FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.add(R.id.fragment_container, fragment); 
fragmentTransaction.commit(); 

Затем создайте метод для добавления FragmentB, и этот метод вызывается, когда это требуется.

public void addFragmentB() { 
    FragmentB fragmentB = new FragmentB(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
} 
+0

отлично. Я также нашел это решение. –

0

Используйте этот код fragmentTransaction.replace() вместо fragmentTransaction.add()

Заменить существующий фрагмент, который был добавлен в контейнер. Это по существу то же самое, что и вызов remove (Fragment) для всех добавленных в настоящее время фрагментов, которые были добавлены с тем же контейнером, и затем добавьте (int, Fragment, String) те же аргументы, которые приведены здесь.

+0

уже пробовал, но не работает –

0
If(null!=fragment) 
    fragment=null; 
    switch(currentFragment){ 
    case A: 
    fragment = new FragmentA(); 
    break; 
    case B: 
    fragment= new FragmentB(); 
    break;} 
    fragmentTransaction.replace(R.id.frame_layout, fragment); 
    fragmentTransaction.commit(); 
    Toast.makeText(this, String.valueOf(s), Toast.LENGTH_LONG).show(); 

Изменения должны быть сделаны: 1. Удалите теги фрагментов из вашего Activity_main и создайте единый макет кадра 2.In fragmentTransaction.replace добавьте соответствующий идентификатор frameelayout вашего Activity_main.

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

+0

не работает –

+0

см. Обновленный код –

+0

Проверьте обновленный ответ .. – Moulesh

Смежные вопросы