2012-05-02 2 views
7

Sono abbastanza nuovo per Android, quindi questo potrebbe avere una risposta ovvia, ma non riesco a trovarlo.Android: aggiunta di un frammento a un'attività

Sto scrivendo una versione di un'app calcolatrice. Voglio fare in modo che quando un utente fa clic su uno dei pulsanti, questo avvia un frammento (con più pulsanti su di esso che possono quindi utilizzare per più input).

il frammento di codice è il seguente:

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class VariableMenu extends Fragment { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);} 

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

    } 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.fragment, container, false); 
} 

} 

con un layout XML come segue:

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

<Button 
     android:id="@+id/Bx" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="X" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/By" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/Bx" 
     android:layout_alignTop="@id/Bx" 
     android:text="Y" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/Bz" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/By" 
     android:layout_alignTop="@id/By" 
     android:text="Z" 
     android:onClick="onButtonClicked"/> 

</RelativeLayout> 

(so che non dovrebbe usare le stringhe hard-coded, ma io correggi che una volta che ottengo la cosa in esecuzione)

Ho provato ad averlo aggiunto utilizzando un frammenttransaction con il metodo onTouch del pulsante di attivazione, in questo modo:

public void onFragmentActivated(View v) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     VariableMenu fragment = new VariableMenu(); 
     fragmentTransaction.add(R.layout.main, fragment); 
     fragmentTransaction.commit(); 
    } 

ma che ha dato un errore dicendo che c'era "Nessuna vista trovata per id: ... (principale) per frammento VariableMenu."

Allora ho fatto una visione per esso nel file XML principale:

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

(Irrelevant things) 

    <fragment 
     android:id="@+id/Fragment" 
     android:name="calculator.app.VariableMenu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

(Irrelevant things) 

</RelativeLayout> 

Ma questo ha provocato il frammento di essere lì, non appena l'attività è stato creato (e setContentView (R.layout.main) ; corse).

C'è un modo semplice per aggiungere e rimuovere un frammento con un'interfaccia utente a livello di programmazione in un'attività?

risposta

11

Il problema qui è che il frammento ha bisogno di un contenitore con un ID vista da risiedere all'interno. Dandogli un ID di layout risulterà l'errore che hai visto.

È possibile aggiungere il frammento al proprio layout relativo, ma per farlo correttamente è necessario assegnargli i parametri di layout appropriati in modo che possano essere posizionati. Sarebbe più semplice creare un FrameLayout all'interno del relativo layout che avvolge il suo contenuto e quindi aggiungere il frammento lì.

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

    <FrameLayout 
     android:id="@+id/FragmentContainer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

</RelativeLayout> 

Poi

fragmentTransaction.add(R.id.FragmentContainer, fragment); 
+1

+1. @Spencer inoltre, se il tuo frammento può agire come un'attività separata, puoi modificarlo per estendere FragmentActivity e trattarlo come un'attività regolare. – Joe

+0

Grazie mille, ha funzionato perfettamente. Non penso che FragmentActivity possa funzionare in questo caso, ma terrò a mente questa opzione per il futuro. – Spencer