2012-08-25 39 views
26

Tôi đang trong quá trình tạo ứng dụng đầu tiên cho Android và tôi có một số Fragment được thêm vào số Activity của mình theo phương pháp của Activity. Vấn đề tôi đang phải đối mặt là tôi không thể tìm thấy bất kỳ chế độ xem nào có trong số Fragment từ phương thức onCreate() của Activity.Truy cập Fragment View từ hoạt động của OnCreate

Các chủ đề khác đã gợi ý rằng điều này là do Fragment chưa được tăng cao, vì vậy findViewById() sẽ trả về giá trị rỗng cho bất kỳ chế độ xem nào có trong số Fragment.

Dưới đây là những gì tôi có nghĩa là:

Hoạt động:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.out.println("activity onCreate"); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) { 
     return; 
    } 

    initialiseUI(); // Fragment added to Activity 

    System.out.println("end of activity onCreate"); 
} 

Fragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
System.out.println("fragment onCreateView"); 
    return inflater.inflate(R.layout.event_log, container, false); 
} 

này in ra kết quả:

hoạt động onCreate kết thúc hoạt động onCreate mảnh onCreateView

Do lệnh này, bất kỳ nỗ lực để truy cập quan điểm của Fragment trong Activity 'phương pháp onCreate() s (sử dụng findViewById()) tạo ra một NullPointerException, như Fragment' s onCreateView() chỉ được gọi sau khi kết thúc các Activity 's onCreate().

Sử dụng FragmentManger 's executePendingTransactions() sau khi thêm Fragment không giúp ích.

Về cơ bản, tôi đã buộc phải đặt mã vấn đề trong Activity 'onStart() phương pháp thay vì onCreate() s, như onStart() xảy ra SAU Fragment' s onCreateView().

Có ai thực hành tiêu chuẩn ở đây không hay cách tôi có thể làm cho mã truy cập Xem phân đoạn của tôi hoạt động trong phương thức của Activity?

+1

Tại sao bạn muốn truy cập chế độ xem 'Fragment' trong phương thức' onCreate() 'của' Activity'? Có điều gì đó không ổn với desing của bạn. – biegleux

+0

Cụ thể, sau khi thêm một Fragment vào phương thức onCreate() của Activity, tôi muốn thay đổi văn bản của một TextView chứa trong Fragment và thêm một số mục vào Spinner. Điều gì có thể sai với thiết kế của tôi? – Dan

+0

Than cập nhật bố cục của phân đoạn của bạn trong phương thức 'onCreateView()' của 'Fragment'. Xem câu trả lời của tôi. – biegleux

Trả lời

19

Cập nhật chế độ xem của bạn trong onCreateView().

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.event_log, container, false); 
    TextView tv = (TextView) view.findViewById(R.id.text); 
    tv.setText("hello world"); 
    return view; 
} 

Hoặc nếu thay đổi của bạn phụ thuộc vào ActivityFragment của bạn được gắn vào, sử dụng onActivityCreated().

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

    TextView tv = (TextView) getView().findViewById(R.id.text); 
    tv.setText(getActivity.getSomeText()); 
} 
+0

Ok, sau một triệu vấn đề khác mà tôi sẽ không đi vào, cuối cùng tôi đã làm việc này đúng cách! Cảm ơn sự giúp đỡ của bạn. – Dan

+1

@Dan, bạn có thể chia sẻ chính xác các vấn đề khác và cách bạn sử dụng ở trên để giải quyết nó không? Nó sẽ là một đóng góp to lớn cho cộng đồng. –

+1

Về cơ bản, tôi đã thử sử dụng onActivityCreated() để khởi tạo các thành phần của mình, nghĩ rằng phương thức này sẽ chỉ được gọi một lần. Điều này gây ra rất nhiều vấn đề khi tạm dừng và khởi động lại ứng dụng của tôi, vì phương pháp này đã đặt lại tất cả các thành phần của tôi, vì nó được gọi mỗi lần. Sau đó, khi cố gắng thực hiện công việc này bằng cách sử dụng onCreateView(), tôi đã sử dụng getView(). FindViewById (...) thay vì sử dụng biến "view" đã được khởi tạo. Đó là một sai lầm ngớ ngẩn, nhưng cuối cùng tôi đã đến đó! Vì vậy, bây giờ văn bản được lưu vào một trường trong onCreate() và đưa vào TextView trong onCreateView(). – Dan

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