2012-05-06 36 views
19

Tôi mới phát triển Android và tất nhiên trên Phân đoạn.findViewById trả về NULL khi sử dụng Fragment

Tôi muốn truy cập các điều khiển của đoạn của tôi trong hoạt động chính nhưng 'findViewById' trả về giá trị rỗng. không có đoạn mã hoạt động tốt.

Dưới đây là một phần của mã của tôi:

Các đoạn:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    tools:ignore="HardcodedText" > 

    <EditText 
     android:id="@+id/txtXML" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:ems="10" 
     android:scrollbars="vertical"> 
    </EditText> 

</LinearLayout> 

các onCreate của MainActivity:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setContentView(R.layout.main); 

     this.initialisePaging(); 

     EditText txtXML = (EditText) findViewById(R.id.txtXML);} 

vào thời điểm này txtXML là null.

Điều gì bị thiếu trong mã của tôi hoặc tôi nên làm gì?

+0

hãy đăng phương thức initialisePaging() – blacharnia

+0

của bạn có ý nghĩa quan trọng trong 'this.initialisePaging();' chỉ thêm các đoạn vào viewPager – mammadalius

Trả lời

14

Bạn nên inflate cách bố trí của các mảnh vỡ trên onCreateView phương pháp của Fragment sau đó bạn chỉ có thể truy cập nó là yếu tố với findViewById trên Activity của bạn.

Trong ví dụ này bố cục đoạn của tôi là LinearLayout nên tôi Truyền kết quả inflate tới LinearLayout.

public class FrgResults extends Fragment 
    { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      //some code 
      LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false); 
      //some code 
      return ll; 
     } 
    } 
+1

whats that some code? – vasanth

+0

Ngoài ra hãy chắc chắn rằng nếu bạn đang sử dụng hỗ trợ v4 cho Android, bạn sử dụng 'FragmentActivity' và' getSupportFragmentManager' để tránh bị 'null'. Nếu bạn chỉ đang xây dựng cho các phiên bản mới hơn của api Android thì hãy sử dụng 'Hoạt động' thông thường và phương thức' getSupportFragmentManager'. * không * kết hợp hai cách thực hiện này –

2

1) Hãy thử điều này:

đơn Eclipse -> Project -> sạch ...

cập nhật

2) Nếu bạn có 2 hoặc nhiều trường hợp bố trí 'chính', kiểm tra xem tất cả trong số họ có một cái nhìn với id 'txtXML'

3)

một Fragment là một phần của người sử dụng một ứng dụng trong terface hoặc hành vi có thể được đặt trong một Activity. Tương tác với các mảnh được thực hiện thông qua FragmentManager, có thể lấy thông qua Activity.getFragmentManager() và Fragment.getFragmentManager().

Lớp Phân đoạn có thể được sử dụng nhiều cách để đạt được nhiều kết quả khác nhau. Đó là cốt lõi, nó đại diện cho một hoạt động hoặc giao diện cụ thể đang chạy trong một Hoạt động lớn hơn. Phân đoạn được gắn chặt với Hoạt động của nó và không thể được sử dụng ngoài một hoạt động. Mặc dù Fragment định nghĩa vòng đời của chính nó, vòng đời đó phụ thuộc vào hoạt động của nó: nếu hoạt động bị dừng lại, không thể bắt đầu các mảnh vỡ bên trong nó; khi hoạt động bị phá hủy, mọi mảnh vỡ sẽ bị phá hủy.

Nghiên cứu this. bạn phải sử dụng FragmentManager.

+0

+1 để giải quyết vấn đề khác của tôi chứ không phải vấn đề này. – mammadalius

+0

bạn đang gặp sự cố chưa? – breceivemail

+0

Bạn chỉ có một ví dụ về bố cục "chính"? – breceivemail

3

Bạn không thể truy cập vào quan điểm của đoạn trong lớp hoạt động bởi findViewById thay vì những gì bạn có thể làm là ...

Bạn phải có một đối tượng của lớp Fragment trong bạn tập tin hoạt động, phải không? tạo phương thức getter của lớp EditText trong lớp phân đoạn đó và truy cập phương thức đó trong hoạt động của bạn.

tạo cuộc gọi trở lại trong lớp Phân đoạn trong trường hợp bạn cần obj Edittext.

+0

Tôi chọn Fragments cho giải pháp của tôi để giảm độ phức tạp của nó và cũng tăng cường hiệu suất nhưng có vẻ như nó trở nên phức tạp hơn. – mammadalius

+0

nó không phức tạp ... Nó mạnh mẽ và có thể cung cấp cho bạn sự linh hoạt hơn –

4

Tôi trễ, nhưng đối với bất kỳ ai khác có vấn đề này. Bạn nên tăng lượt xem của mình trong phương thức onCreateView. Sau đó, ghi đè phương thức onCreateActivity và bạn có thể sử dụng getView().findViewById ở đó.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup  container, Bundle savedInstanceState) 
{ 
    return  inflater.inflate(R.layout.fragment, container, false); 
} 
+0

Bạn nói đúng. Vấn đề của tôi được giải quyết trước đây. Vui lòng hiển thị một số đoạn trích để người khác có thể sử dụng. – mammadalius

+0

'@Override Chế độ xem công khai onCreateView (Bố cục lưu lượngInflater, vùng chứa Nhóm View, Gói được lưuInstanceState) { trả về inflater.inflate (R.layout.fragment, container, false); } ' – gdi

+0

Kính gửi @Futan Xin vui lòng viết bình luận của bạn như là một câu trả lời riêng biệt với mô tả rõ ràng là hữu ích cho người khác và tất nhiên tôi có thể chọn nó làm Câu trả lời được chấp nhận. – mammadalius

17

Hãy thử như thế này trên mảnh của bạn trên onCreateView

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    if (container == null) { 
     return null; 
    } 

    LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML); 

    return ll; 
} 
+0

Điều này được giải quyết trước đây. Những gì tôi tìm kiếm là txtXML trên MainActivity, không phải trên Fragment. – mammadalius

0

Nếu bạn muốn sử dụng findViewById như bạn sử dụng tại các hoạt động onCreate, bạn chỉ có thể đặt tất cả trong phương pháp overrided onActivityCreated.

+0

nó trả về cùng một giá trị null trong phương thức onActivityCreated. – hopeTo

+0

Hãy cho tôi xem mã của bạn, vui lòng – Moesio

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