2013-06-10 39 views
13

Tôi có một số FragmentActivity nơi tôi thêm Fragment. Tùy thuộc vào một số trường hợp, tôi muốn truy cập Buttons từ bố cục của phân đoạn đó và thay đổi người nghe nhấp chuột của chúng.Xem chế độ xem Fragment từ FragmentActivity

Những gì tôi làm là:

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

Nhưng biến view luôn là null.

Làm cách nào để có được chế độ xem hoạt động?

+1

MyFragment được thêm và hiển thị? –

+1

Lưu ý rằng bạn đang gọi 'findViewById()' trên cấu trúc phân cấp của hoạt động của bạn, không phải là 'view''s. – laalto

+0

Khi bạn làm: 'Nút myButton = (Button) findViewById (R.id.my_button);', bạn cố gắng tìm ra nút cho chế độ xem hiện tại của bạn không phải là 'chế độ xem đoạn' của bạn. Do đó nó không hoạt động như mong đợi. –

Trả lời

21

Nếu bạn muốn truy cập thành phần của bạn và thiết lập một số dữ liệu, tôi đề nghị bạn thực hiện một phương pháp bên trong đoạn như thế này:

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() có thể trả về null và nó làm như vậy trong nhiều trường hợp. Nếu tôi gọi setSettings từ phương thức OnCreate của Activity, ngoại lệ sẽ được ném –

12

thử điều này:

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

mã này phải công trình khỏe. Tôi hy vọng, điều này sẽ giúp bạn.

2

Để đặt OnClickListeners thành các đoạn, hãy ghi đè onViewCreated trong lớp phân đoạn của bạn.

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

Tôi đã cố gắng đặt timertask để tự động tải lại chế độ xem web trong một đoạn và phương pháp này là thứ duy nhất có hiệu quả đối với tôi. Dự án của tôi là trên github.

Nguồn: this answer

1

Khi bạn khởi tạo nút của bạn bên trong một lớp học kéo dài Fragment nó tốt hơn để làm điều đó bên trong phương pháp onViewCreated(). Điều này sẽ đảm bảo rằng chế độ xem đã tồn tại.

1

Chỉ cần sử dụng phương thức getRootView() để lấy dữ liệu phân đoạn của bạn trong Hoạt động.

//below block of code write in activity. 

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

tên là trường phân đoạn.

Các vấn đề liên quan