我能把setContentView放在onCreate方法之外吗?

9

我看到很多人说你可以在oncreate方法之外设置setContentView,但我没有找到任何示例。现在当我尝试使用setContentView时,我的应用程序就会崩溃。以下是我的源代码:

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>

更详细地说,我可以在oncreate方法中使用setContentView(R.layout.timepicker)而没有任何问题,因此问题是setContentView在New_ala.java类中无法正常工作。有人能帮我吗?
设置意图后的代码: 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));
        }
    }

新警报活动:
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
我的应用程序崩溃了,请附上LogCat和异常信息。 - Guillaume
3个回答

10

您可以在运行事件 (UI) 线程时随时调用 setContentView。请注意,这样做时,通过调用 findViewById 初始化的任何字段都需要进行重置。


4

最好的方法是有多个活动:不要使用 nou1.nou_alarma();,而是创建一个意图(intent)并启动一个新的带有新布局的活动(activity)。

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

NewAlarmActivityonCreate方法中,将内容视图设置为R.layout.timepicker


谢谢您的回复。我创建了新的活动,但是当我在模拟器中运行程序时,屏幕变黑,什么也没有发生。这段经过编辑的代码在我的问题描述中。 - vicciu
如果您希望我们调查崩溃问题,您需要发布 LogCat 的内容,该内容显示异常信息。 - Guillaume
我找到了问题所在。程序一直是黑屏的,因为没有启动新意图的条件,而且新意图一启动就立即返回到主方法,如此循环。现在我解决了这个问题,它运行得非常好。非常感谢。 - vicciu

-4

setContentView() 方法在一个 Activity 中只能被调用一次。如果你想要在某个时刻完全改变布局,你应该选择使用 ViewFlipper 或者在 Activity 中设置两个布局,并通过调用 view.setVisibility(View.GONE);view.setVisibility(View.VISIBLE); 来显示其中的一个。


12
第一部分完全错误。setContentView 可以被任意调用多次。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接