2012-02-10 38 views
17

Tôi có chế độ xem văn bản trong Lyout và tôi muốn đặt một số văn bản thành dạng xem văn bản này. Điều này nên được thực hiện trong một lớp học không phải là lớp MainActivity.findViewById() không hoạt động trong lớp MainActivity

Vấn đề là tôi có ngoại lệ con trỏ null.

Đây là mã của tôi:

public class UserInformations extends Activity{ 

TextView emailTextView; 
LocalDatabase localdatabase= new LocalDatabase(this); 


    public void getUserInformation() 
    { 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    String email = localdatabase.getUserEmail(); 
    emailTextView.setText(email); 
    } 
} 

Khi tôi đang làm điều này trong lớp Hoạt động chính, nó hoạt động, nhưng nó không hoạt động không trong lớp khác.

+0

các emailTextView = (TextView) findViewById (R.id.EmailTextView); –

+0

Không, cơ sở dữ liệu của tôi nằm trong một lớp khác. giá trị email là tốt, vì vậy tôi nghĩ rằng vấn đề đến foom textView –

Trả lời

29

Gọi findViewById() trên đối tượng Activity sẽ chỉ hoạt động nếu bố cục Hoạt động hiện tại được đặt bởi setContentView. Nếu bạn thêm bố cục thông qua một số phương tiện khác, thì bạn cần đối tượng View của bố cục và gọi findViewById() trên đó.

View v = inflater.inflate(id_number_of_layout); # such as R.layout.activity_main 
View innerView = v.findViewById(id_number_of_view_inside_v); 

Nếu bố trí được coi là bố trí chính của hoạt động này, sau đó làm điều này:

public class MyActivity extends Activity{ 
    TextView emailTextView; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(id_number_of_layout); 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    // ... whatever other set up you need to do ... 
    } 

    public void getUserInformation() { 
    // .... regular code ... 
    } 
} 
+0

Cảm ơn bạn DeeV, tôi có một số vấn đề để hiểu mã này, xin lỗi. Vì vậy, trong hoạt động chính của tôi, tôi đã gọi setcontentview (...) nhưng bây giờ trong lớp thứ hai của tôi, làm thế nào tôi có thể tìm thấy số Id id_number_of_layout của tôi và id_number_of_view_inside_v –

+0

Bạn biết những gì họ đã có. Trong trường hợp của bạn, bạn cần lấy một thể hiện của bố cục có chứa khung nhìn với ID 'R.id.EmailTextView'. Nói chung, nếu bạn đang sử dụng một lớp khác ngoài lớp 'Activity', thì bạn phải chuyển khung nhìn qua phương thức khởi tạo hoặc phương thức setter. Vì khung nhìn chính đã được thổi phồng trong lớp hoạt động chính của bạn, sau đó bạn có thể muốn gọi 'findViewById (R.id.EmailTextView)' trong lớp đó, sau đó chuyển tham chiếu đối tượng của khung nhìn văn bản đến lớp khác của bạn. – DeeV

+0

Ok, cảm ơn bạn rất nhiều, tôi sẽ làm theo cách này. –

5

Bạn chưa đặt Chế độ xem nội dung?


để làm một cái gì đó sử dụng này như thế này:

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


    } 


} 
+0

Không, làm thế nào để làm điều này, tôi đang làm việc cho lần đầu tiên với nội dung của xem. –

+0

Tôi đã lưu ý ở trên ^^ – FabianCook

+0

Tôi đã có trong lớp MainActivity của tôi. –

4
findViewById(R.id.EmailTextView); 

Bạn có thể

  1. Không thiết lập Xem bố trí
  2. Không có Xem với ID EmailTextView và do đó findViewById trả về null. Bạn không phải đặt loại, nhưng ID bạn đã cho anh ta trong XML.

EDIT: chắc chắn số 1 dựa trên nhận xét mới của bạn.

+0

Cảm ơn bạn, nhưng làm thế nào để xem bố trí xem? –

3

Khi bạn gọi findViewById vấn đề. Bố cục phải đã xảy ra. Bạn phải đã đặt chế độ xem nội dung, v.v.

Có nhiều cách để giải quyết vấn đề này, như được hiển thị trong các câu trả lời khác, nhưng chúng hoạt động cơ bản khác với findViewById và chỉ được sử dụng để thay thế nếu bạn hiểu chính xác cách thức họ làm việc. Thông thường, hiệu quả hơn rất nhiều khi chỉ đợi cho đến sau khi bố cục ban đầu đã xảy ra.

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