2013-08-01 5 views
5

Sono nuovo nello sviluppo di Android e sto cercando di scrivere un'applicazione piccola e semplice. Questa applicazione non dovrebbe fare altro che leggere il testo da 2 EditTexts e quando l'utente preme il pulsante "invia" dovrebbe scrivere il testo su 2 TextViews. Ognuna di queste TextViews si trova in un frammento.Chiamata di findViewById in Fragment per trovare un pulsante restituisce null

Ma non posso aggiungere onClickEvent al pulsante, poiché findViewById (R.id.sendTextButton) restituisce sempre null. Ho provato a far funzionare questa app ma non sono riuscito a trovare nessuna soluzione.

Ecco gli codeblocks rilevanti:

La funzione onCreateView del frammento, che deve gestire il primo ingresso (HeadlineFragment.java):

Button sendButton = null; 
View inflatedView = null; 

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

    this.inflatedView = inflater.inflate(R.layout.headline_view, container, false); 

    sendButton = (Button) inflatedView.findViewById(R.id.sendTextButton); 

    if(sendButton == null) 
    { 
     Log.d("debugCheck", "HeadFrag: sendButton is null"); 
     return inflatedView; 
    } 
    sendButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String headline = ((EditText) v.findViewById(R.id.enterHeadlineText)).getText().toString(); 
      ((TextView) v.findViewById(R.layout.headline_view)).setText(headline); 
     } 
    }); 
    return inflatedView; 
} 

Il file XML con il layout (activity_main.xml):

<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="match_parent" 
     android:orientation="vertical"> 

     <EditText 
      android:id="@+id/enterHeadlineText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/enterHeadlineTextHint" 
      android:maxLines="1" 
      android:inputType="textCapSentences" 
     /> 

     <EditText 
      android:id="@+id/enterMessageText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:hint="@string/enterMessageTextHint" 
      android:maxLines="1" 
      android:inputType="textCapSentences" 
      /> 

     <Button 
      android:id="@+id/sendTextButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:text="@string/sendTextButton" 
      /> 



     <fragment android:name="com.example.mysecondapplication.HeadlineFragment" 
      android:id="@+id/headlineFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="25dp" 
      /> 

     <fragment android:name="com.example.mysecondapplication.MessageFragment" 
      android:id="@+id/messageFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      /> 



</LinearLayout> 

e il file xml con l'TextView, che dovrebbe contenere il testo (headline_view.xml):

<?xml version="1.0" encoding="utf-8"?> 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/headline_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#FFFFFF" 
    android:text="@string/hello_world" 
/> 

risposta

7
this.inflatedView = inflater.inflate(R.layout.headline_view, container, false); 

sendButton = (Button) inflatedView.findViewById(R.id.sendTextButton); 

siete alla ricerca di un pulsante con id sendTextButton all'interno headline_view.xml. Ma dal layout che hai pubblicato non c'è un pulsante con id sendTextButton. Quel `s modo si ottiene nulla

+0

C'è un modo per cercare in activity_main.xml da dentro il mio frammento o devo accedere al pulsante da un altro file? –

+0

cosa vuoi ottenere. Perché hai bisogno di un pulsante dichiarato all'interno del layout dell'attività all'interno del frammento? Se appartiene alla vista restituita dal frammento, dovresti dichiararlo all'interno di headline_view.xm – Blackbelt

+0

Volevo impostare gli eventi del pulsante, che modificano il contenuto dei frammenti all'interno dei frammenti perché pensavo che questo sarebbe stato una sorta di buon stile. Ma ora cercherò di farlo in qualche altro modo, grazie! –

1

il pulsante è all'interno activity_main.xml, ma si sta gonfiando R.layout.headline_view:

this.inflatedView = inflater.inflate(R.layout.headline_view, container, false); 
+1

@Ahmad grazie per la modifica :) –

1

Questo è il problema

sendButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     String headline = ((EditText) v.findViewById(R.id.enterHeadlineText)).getText().toString(); 
     ((TextView) v.findViewById(R.layout.headline_view)).setText(headline); 
    } 
}); 

la vista v è la vista cliccato, così di coure v.findViewById() non funziona ..
per raggiungere il tuo obiettivo puoi dichiararti EditText e TextView globale, in onCreate() usa il filtro per istanziarli e il metodo onClick puoi usarli!

0

È necessario impostare onClickListener all'interno dell'attività da cui si gestiscono i frammenti e non all'interno del frammento, se il pulsante non si trova nel layout gonfiato dal frammento.