2013-06-10 15 views
13

Mam FragmentActivity gdzie dodaję Fragment. W zależności od sytuacji chcę uzyskać dostęp do Buttons z układu tego fragmentu i zmienić ich odbiorców.Pobierz fragment FragmentActivity

Co mogę zrobić, to:

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

Ale zmienna view jest zawsze null.

Jak mogę uzyskać widok działalności?

+1

Czy myFragment jest widoczny i widoczny? –

+1

Należy zauważyć, że wywołujesz 'findViewById()' w hierarchii widoków działania, a nie 'widok'. – laalto

+0

Kiedy to zrobisz: 'Button myButton = (Button) findViewById (R.id.my_button);', próbujesz znaleźć przycisk dla twojego bieżącego widoku, który nie jest twoim 'widokiem fragmentu'. Dlatego nie działa zgodnie z oczekiwaniami. –

Odpowiedz

21

Jeśli chcesz uzyskać dostęp do komponentu i ustawić niektóre dane, proponuję, aby metodę wewnątrz fragmentu jak ten:

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

Funkcja getView() może zwrócić wartość null, co w wielu przypadkach jest możliwe. Jeśli wywołasz setSettings z metody działania OnCreate, zgłoszony zostanie wyjątek –

12

spróbować tego:

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()); 
     } 
    } 
} 

Kod ten musi prace w porządku. Mam nadzieję, że to ci pomoże.

2

Aby ustawić OnClickListeners we fragmentach, należy zastąpić onViewCreated w klasie fragmentów.

@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); 
} 

starałem się ustawić TimerTask automatycznie przeładować webview we fragmencie, a ta metoda była jedyną rzeczą, która pracowała dla mnie. Mój projekt jest na github.

Źródło: this answer

1

Kiedy włączasz przycisk wewnątrz klasy, która rozciąga Fragment to lepiej zrobić to wewnątrz metody onViewCreated(). Zapewni to, że widok już istnieje.

1

Po prostu użyj metody getRootView(), aby uzyskać dane swojego fragmentu w Aktywności.

//below block of code write in activity. 

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

nazwa to pole fragmentu.

Powiązane problemy