2013-06-10 14 views
13

Ho un FragmentActivity dove aggiungo uno Fragment. A seconda di alcune situazioni, desidero accedere a Buttons dal layout di quel frammento e modificare gli ascoltatori di clic.Visualizza frammento da FragmentActivity

Quello che faccio è:

View view = myFragment.getView(); 
Button myButton = (Button) view.findViewById(R.id.my_button); 
myButton.setOnClickListener(new MyClickListener()); 

Ma la variabile view è sempre null.

Come visualizzare la visualizzazione dell'attività?

+1

myFragment è stato aggiunto e visibile? –

+1

Nota che stai chiamando 'findViewById()' nella gerarchia di visualizzazione della tua attività, non 'view''s. – laalto

+0

Quando si esegue: 'Button myButton = (Button) findViewById (R.id.my_button);', si tenta di trovare il pulsante per la vista corrente che non è la 'vista frammento'. Quindi non funziona come previsto. –

risposta

21

Se si desidera accedere il componente e impostare alcuni dati, vi consiglio di fare un metodo all'interno del frammento in questo modo:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class DetailFragment extends Fragment { 

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


    public void setSettings(){ 
     Button button = (Button) getView().findViewById(R.id.my_button); 
     button.setOnClickListener(new MyClickListener()); 
    } 
} 
+0

getView() potrebbe restituire null e lo fa in molti casi. Se chiamo setSettings dal metodo OnCreate di Activity verrà lanciata l'eccezione –

12

provare questo:

public class YourFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      return inflater.inflate(R.layout.your_fragment, null); 
    } 

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

     View view = getView(); 
     if(view != null) { 
      view.findViewById(R.id.my_button).setOnClickListener(new MyClickListener()); 
     } 
    } 
} 

questo codice deve opere bene. Spero, questo ti aiuterà.

2

Per impostare OnClickListeners in frammenti, sovrascrivere onViewCreated nella classe frammento.

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    view.findViewById(R.id.yourId).setOnClickListener(this); 
    //or 
    getActivity().findViewById(R.id.yourId).setOnClickListener(this); 
} 

stavo cercando di impostare un TimerTask per ricaricare automaticamente una WebView in un frammento e questo metodo era l'unica cosa che ha funzionato per me. Il mio progetto è github.

Fonte: this answer

1

Quando si inizializza il pulsante all'interno di una classe che estende Fragment è meglio farlo all'interno del metodo onViewCreated(). Questo garantirà che la vista esiste già.

1

Utilizzare semplicemente il metodo getRootView() per ottenere i dati del frammento in Attività.

//below block of code write in activity. 

EditText et = (EditText) v.getRootView().findViewById(R.id.name); 
Log.d("Name", et.getText().toString()); 

nome è il campo del frammento.

Problemi correlati