2013-06-10 5 views
13

Ich habe eine FragmentActivity, wo ich eine Fragment hinzufügen. Je nach Situation möchte ich von dem Layout dieses Fragments aus auf Buttons zugreifen und die Listener von ihnen ändern.Erhalten Sie eine Ansicht von Fragment von FragmentActivity

Was ich tue, ist:

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

Aber die view Variable ist immer null.

Wie kann ich den Überblick über die Aktivität erhalten?

+1

Ist myFragment hinzugefügt und sichtbar? –

+1

Beachten Sie, dass Sie 'findViewById()' in der Ansichtshierarchie Ihrer Aktivität aufrufen, nicht 'view's. – laalto

+0

Wenn Sie: 'Button myButton = (Button) findViewById (R.id.my_button);', versuchen Sie den Button für Ihre aktuelle Ansicht zu finden, die nicht Ihre 'Fragmentansicht' ist. Daher funktioniert es nicht wie erwartet. –

Antwort

21

Wenn Sie Ihre Komponente zugreifen möchten und einige Daten eingestellt, empfehle ich Ihnen innerhalb des Fragments wie dieses, ein Verfahren zu machen:

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() kann null zurückgeben und tut es in vielen Fällen. Wenn ich setSettings von der OnCreate-Methode von Activity aufruft, wird die Ausnahme ausgelöst –

12

versuchen, dieses:

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

Dieser Code muss Werke fein. Ich hoffe, das wird dir helfen.

2

Um OnClickListeners in Fragmenten zu setzen, überschreiben Sie onViewCreated in Ihrer Fragmentklasse.

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

ich versuche, eine Timertask zu setzen, um automatisch eine Webansicht in einem Fragmente neu laden und diese Methode war das einzige, was für mich gearbeitet. Mein Projekt ist auf github.

Quelle: this answer

1

Wenn Sie Ihre Schaltfläche innerhalb einer Klasse initialisieren, die Fragment reicht es besser ist es im Inneren des onViewCreated() Methode zu tun. Dies garantiert, dass die Ansicht bereits existiert.

1

Verwenden Sie einfach die Methode getRootView(), um die Daten Ihres Fragments in Activity abzurufen.

//below block of code write in activity. 

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

Name ist das Feld des Fragments.