2012-11-08 7 views
2

J'ai des problèmes pour travailler avec des fragments. Le problème est: j'ai une disposition dans mon activité avec un ListView. Lorsque je sélectionne un élément dans cette ListView, instancie un fragment remplaçant la disposition d'activité. Mon résultat est à la fois le fragment et le contenu de l'activité apparaissent à l'écran, se superposant. Que puis-je corriger (le fragment remplaçant simplement le contenu de l'activité)? Voici les codes:Fragment superposant une disposition d'activité

activityLayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/activity" 
android:orientation="vertical"> 

    <FrameLayout android:id="@+id/fragment_to_replace" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:orientation="vertical" 
     android:layout_gravity="center" > 

     <TextView android:id="@+id/textView" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:visibility="visible" 
      android:text="@string/textView_select_table" 
      android:textSize="30dp"/> 

     <ListView android:layout_marginTop="20dp" 
     android:layout_width="fill_parent" 
     android:layout_height="200dp" 
     android:id="@+id/listView" 
     android:visibility="visible" 
     android:paddingTop="40dp" /> 

    </FrameLayout> 

</LinearLayout> 

Activity.java

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity); 

    View view = findViewById(R.id.activity);  

    //Getting the ListView 
    ListView listView = (ListView) view.findViewById(R.id.listView); 
    listView.setTextFilterEnabled(true); 

    //Setting the adapter 
    listView.setAdapter(new Adapter(this)); 

    listView.setOnItemClickListener(new OnItemClickListener() { 

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

       //Creates a fragment 
       addFragment(); 
     } 

    }); 

} 

public void addFragment(){ 

    MyFragment newFragment; 

    FragmentTransaction newFragmentTransaction = getSupportFragmentManager().beginTransaction(); 

    newFragment = (MyFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.fragment); 

     if (newFragment == null){ 
       newFragment = new MyFragment(this, getSupportFragmentManager()); 
      newFragmentTransaction.replace(R.id.fragment_to_replace, 
       new SelectDrinkFragment(this, getSupportFragmentManager())); 
      newFragmentTransaction.addToBackStack(null); 
      newFragmentTransaction.commit(); 

     } 
} 

fragmentLayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:visibility="visible" 
    android:text="@string/textView_two" 
    android:textSize="20dp"/> 

    <LinearLayout android:layout_marginTop="10dp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:text="@string/textView" /> 

     <TextView android:id="@+id/textView_two" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible"/> 

    </LinearLayout> 

    <TextView 
     android:id="@+id/textView_three" 
     android:layout_marginTop="10dp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:text="@string/textView_three"/> 

    <ListView 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:id="@+id/listView_two" 
    android:visibility="visible" 
    android:paddingTop="40dp" /> 

</LinearLayout> 

Fragment.java

public View onCreateView(final LayoutInflater inflater, final ViewGroup container,  Bundle saveInstanceState){ 


    View view = inflater.inflate(R.layout.fragment, container, false); 

    final ListView listView = (ListView) view.findViewById(R.id.listView_two); 

    CharSequence [] list = getResources().getStringArray(R.array.array); 

    listView.setAdapter(new ListAdapter(getContext(), list)); 

    return view; 

} 

ListAdapter.java

public class ListAdapter extends BaseAdapter{ 

     private Context context; 
     private CharSequence[] drinkArraySize; 

     public ListAdapter(Context context, CharSequence[] array){ 
      super(); 
      this.context = context; 
      this.array= array; 
     } 

     @Override 
     public int getCount() { 
     return array.length; 
     } 

     @Override 
     public Object getItem(int position) { 
     return null; 
     } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    public Context getContext(){ 
      return context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LinearLayout linearLayout = new LinearLayout(getContext()); 

     RadioButton radioButton = new RadioButton(getContext()); 
     radioButton.setText(array[position]); 

     linearLayout.addView(radioButton); 

     return linearLayout; 
    } 

} 

Répondre

3

FragmentTransaction.replace() ressemble à elle remplace seulement un autre fragment (et non seulement un mode d'affichage), donc je suis assez sûr que ce comportement est normal (ou au moins, je sais Cela m'est arrivé auparavant). Je suppose que vous avez quelques options:

  1. Je ne vois pas dans votre code quoi que ce soit qui rendrait opaque de fond du fragment. Vous pourriez essayer cela en premier et voir si ça aide. Si c'est le cas, cela pourrait être le plus simple.

  2. Vous pouvez simplement définir la visibilité des autres éléments sur View.GONE en même temps que vous effectuez votre transaction, mais cela pose certains problèmes en ce qui concerne le backstack.

  3. Vous pouvez remplacer ListView et TextView par un ListFragment à la place. C'est probablement le "meilleur" moyen de le faire, mais c'est aussi probablement le plus de travail.

+0

Salut @ajpolt, j'ai essayé avant ces deux premières options. Le ListFragment semble intéressant, comment je l'implémente? Et une information supplémentaire, j'utilise la bibliothèque ActionBarSherlock. Est-ce un problème pour implémenter ListFragment? – mari

+0

Implémenter un ListFragment est à peu près le même processus que de le faire au niveau de l'activité. Créez simplement une classe qui étend ListFragment, remplacez les méthodes et définissez des vues personnalisées comme vous le feriez avec une ListActivity, puis incluez ListFragment dans votre Activity (il ne doit pas nécessairement être ListActivity, juste une FragmentActivity) comme vous le feriez Fragment régulier. Voir http://developer.android.com/reference/android/app/ListFragment.html. Et ActionBarSherlock ne devrait pas faire la différence si vous pouvez implémenter un ListFragment. – ajpolt

Questions connexes