2012-05-06 30 views
19

Sono nuovo nello sviluppo di Android e, naturalmente, su Fragments.findViewById restituisce NULL quando si utilizza Fragment

Desidero accedere ai controlli del mio frammento nell'attività principale ma 'findViewById' restituisce null. senza frammenti, il codice funziona correttamente.

Ecco parte del mio codice:

Il frammento:

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

    <EditText 
     android:id="@+id/txtXML" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:ems="10" 
     android:scrollbars="vertical"> 
    </EditText> 

</LinearLayout> 

onCreate di MainActivity:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setContentView(R.layout.main); 

     this.initialisePaging(); 

     EditText txtXML = (EditText) findViewById(R.id.txtXML);} 

su questo punto il txtXML è nullo.

Cosa manca nel mio codice o cosa devo fare?

+0

per favore pubblica il tuo metodo initialisePaging() – blacharnia

+0

è importante notare in 'this.initialisePaging();' aggiungi i frammenti al viewPager – mammadalius

risposta

14

Si dovrebbe inflate il layout del frammento su onCreateView metodo della Fragment allora si può semplicemente accedere è elementi con findViewById sul Activity.

In questo esempio il layout del mio frammento è un LinearLayout, quindi inoltro il risultato inflate a LinearLayout.

public class FrgResults extends Fragment 
    { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      //some code 
      LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false); 
      //some code 
      return ll; 
     } 
    } 
+1

che cosa è un codice? – vasanth

+0

Assicurarsi inoltre che se si utilizza il supporto v4 per Android si utilizza 'FragmentActivity' e' getSupportFragmentManager' per evitare di ottenere un 'null'. Se stai costruendo solo per le versioni più recenti di Android API, utilizza un normale 'Activity' e il metodo' getSupportFragmentManager'. non * mescolare * questi due modi di implementazione –

2

1) Prova questa:

menù Eclipse -> Progetto -> Clean ...

aggiornamento

2) Se si dispone di 2 o più istanze di configurazione 'main', verificare se tutti hanno una vista con 'txtXML' id

3)

un frammento è un pezzo di utente di un'applicazione in terfaccia o comportamento che può essere inserito in un'attività. L'interazione con i frammenti avviene tramite FragmentManager, che può essere ottenuto tramite Activity.getFragmentManager() e Fragment.getFragmentManager().

La classe Fragment può essere utilizzata in molti modi per ottenere un'ampia varietà di risultati. È fondamentale, rappresenta una particolare operazione o interfaccia in esecuzione in un'attività più ampia. Un frammento è strettamente legato all'attività in cui si trova e non può essere utilizzato separatamente da uno. Sebbene Fragment definisca il proprio ciclo di vita, quel ciclo di vita dipende dalla sua attività: se l'attività viene interrotta, non è possibile avviare alcun frammento all'interno di esso; quando l'attività viene distrutta, tutti i frammenti verranno distrutti.

Studio this. devi usare FragmentManager.

+0

+1 per risolvere un altro problema ma non questo. – mammadalius

+0

hai ancora problemi? – breceivemail

+0

Hai una sola istanza di layout "principale"? – breceivemail

3

Non è possibile accedere alla vista dei frammenti in classe di attività da findViewById invece quello che si può fare è ...

È necessario disporre di un oggetto della classe Frammento in te file di attività, giusto? crea il metodo getter della classe EditText in quella classe framment e accedi a quel metodo nella tua attività.

creare una richiamata in classe Fragment sull'evento in cui è necessario l'oggetto Edittext.

+0

Seleziono Fragments for my solution per ridurre la complessità di esso e anche un aumento delle prestazioni, ma sembra che sia diventato più complicato. – mammadalius

+0

non è complicato ... È potente e può darti più flessibilità –

4

Sono in ritardo, ma per chiunque altro abbia questo problema. Dovresti gonfiare la tua vista nel metodo onCreateView. Quindi, ignora il metodo onCreateActivity e puoi utilizzare getView().findViewById lì.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup  container, Bundle savedInstanceState) 
{ 
    return  inflater.inflate(R.layout.fragment, container, false); 
} 
+0

Hai ragione. I miei problemi sono stati risolti prima. Si prega di mostrare alcuni frammenti per il gonfiaggio che altri possono usare. – mammadalius

+0

'@Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate (R.layout.fragment, container, false); } ' – gdi

+0

Caro @Futan Scrivi il tuo commento come risposta separata con una descrizione chiara per essere utile per gli altri e, naturalmente, posso selezionarlo come risposta accettata. – mammadalius

17

Prova come questo sui vostri frammenti su onCreateView

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

    if (container == null) { 
     return null; 
    } 

    LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML); 

    return ll; 
} 
+0

Questo è risolto prima. Quello che cercavo era txtXML su MainActivity, non sul Fragment stesso. – mammadalius

0

Se si desidera utilizzare findViewById come si usa in attività onCreate, si può semplicemente mettere tutto in modo overrided onActivityCreated.

+0

restituisce lo stesso valore null nel metodo onActivityCreated. – hopeTo

+0

Mostrami il tuo codice, per favore – Moesio

Problemi correlati