2012-01-08 16 views
7

Tôi đã thấy nhiều người nói rằng bạn có thể đặt setContentView bên ngoài phương thức oncreate, nhưng tôi đã không tìm thấy ở đâu một ví dụ. Bây giờ khi tôi cố gắng sử dụng setContentView, ứng dụng của tôi chỉ bị treo. Đây là mã của tôi nguồn:Tôi có thể sử dụng setContentView bên ngoài phương thức oncreate không?

AlarmActivity.java:

package com.alarm.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button buton = new Button(this); 
     buton.setId(101); 
     buton.setText("New alarm"); 
     buton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
     RelativeLayout layout1 = new RelativeLayout(this); 
     layout1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    layout1.addView(buton); 
    setContentView(layout1); 

    Button nou =(Button)findViewById(101); 
    nou.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      New_ala nou1=new New_ala(); 
      nou1.nou_alarma(); 
      } 
     }); 
    } 
} 

New_ala.java:

package com.alarm.example; 

public class New_ala extends AlarmActivity{ 
public void nou_alarma() { 
setContentView(R.layout.timepicker);   
} 
} 

TimePicker.xml:

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


    <TimePicker 
     android:id="@+id/timePicker" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_alignParentBottom="true"> 

     <Button 
     android:id="@+id/picker_save" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Save"> 
     </Button> 

     <Button 
     android:id="@+id/picker_cancel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Cancel"> 
     </Button> 
</LinearLayout> 

</LinearLayout> 

On cụ thể hơn, tôi có thể sử dụng setContentView (R.layout.timepicker) bên trong phương thức oncreate mà không có bất kỳ vấn đề nào, do đó vấn đề là setContentView không hoạt động đúng trong lớp New_ala.java. Ai giúp tôi với?

Mã sau khi thiết lập mục đích: AlarmActivity:

package com.alarm.example; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
public class AlarmActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startActivity(new Intent(this, NewAlarmActivity.class)); 
     } 
    } 

NewAlarmActivity:

package com.alarm.example; 
import android.os.Bundle; 
public class NewAlarmActivity extends AlarmActivity{ 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.timepicker); 
} 
    } 
+1

"Ứng dụng của tôi chỉ gặp sự cố", vui lòng đăng LogCat với ngoại lệ – Guillaume

Trả lời

3

Cách tốt nhất để làm điều đó là có nhiều hoạt động: thay vì nou1.nou_alarma();, tạo ra một ý định và bắt đầu một hoạt động mới với bố cục mới.

startActivity(new Intent(this, NewAlarmActivity.class)); 

Và trong phương pháp onCreate của NewAlarmActivity, thiết lập xem nội dung để R.layout.timepicker

+0

Cảm ơn bạn đã trả lời. Tôi tạo ra các hoạt động mới nhưng khi tôi chạy chương trình trong trình mô phỏng, màn hình bị đen và không có gì xảy ra. Mã này sau khi chỉnh sửa nằm trong phần mô tả câu hỏi của tôi – vicciu

+0

Nếu bạn muốn chúng tôi điều tra sự cố, bạn cần đăng nội dung của LogCat, hiển thị ngoại lệ – Guillaume

+0

Tôi đã tìm thấy sự cố. Chương trình luôn luôn là màu đen vì không có điều kiện để bắt đầu ý định mới và ngay sau khi ý định mới bắt đầu nó trở lại phương pháp chính và vân vân. Bây giờ tôi đã giải quyết được vấn đề và nó hoạt động rực rỡ. Cảm ơn rất nhiều. – vicciu

-4

Phương pháp setContentView() có thể được gọi là một lần duy nhất cho mỗi hoạt động. Nếu bạn muốn thay đổi hoàn toàn bố cục tại một thời điểm nào đó, bạn nên đi theo số ViewFlipper hoặc có 2 bố cục trong hoạt động và chỉ hiển thị một trong số chúng tại thời điểm đã cho bằng cách gọi view.setVisibility(View.GONE);view.setVisibility(View.VISIBLE); tương ứng.

+11

Phần đầu tiên đơn giản là sai. 'setContentView' có thể được gọi là số lần tùy ý. –

9

Bạn có thể gọi setContentView bất kỳ lúc nào bạn đang chạy trên chuỗi sự kiện (Giao diện người dùng). Lưu ý rằng khi bạn thực hiện, bất kỳ trường nào bạn đã khởi tạo bằng cách gọi findViewById sẽ cần được đặt lại.