每当我创建一个新按钮时,我的应用程序都会关闭


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 register_activity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        RelativeLayout RLayout = (RelativeLayout) View.inflate(this, R.layout.register, null);
        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.FILL_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );
        Button btnCreateNew = new Button(this);
        btnCreateNew.setText("Create New User");
        btnCreateNew.offsetTopAndBottom(10);
        btnCreateNew.offsetLeftAndRight(10);
        RLayout.addView(btnCreateNew, p);
    }
}

因此,代码可以正常工作并运行良好,只是我看不到正在显示的按钮。布局只是空白的,里面什么都没有。

怎么了?

你有一个NullPointerException,对吧?(检查你的日志猫!

原因:

  1. 创建一个按钮作为成员变量,this作为参数。这可能会导致一些麻烦,因为在调用new Button(this)时可能无法定义this。将初始化移到onCreate

  2. 你的RLayout将是空的,在这里我非常确定。原因是,在你打电话之前,你不能打电话给findViewById() setContentView()。如果你之前调用它,Android 不知道在哪里查看并返回 null。

更新

随着你对问题进行了很大的更改,这是我更新的答案:

您将内容设置为R.layout.register,然后再次将其膨胀。

我给你的解决方案:只使用setContentView(R.layout.register),而不是使用findViewById(R.id.layout_id),最后创建并添加你的按钮:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    RelativeLayout RLayout = (RelativeLayout) findViewById(R.id.layout_id);
    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT
    );
    Button btnCreateNew = new Button(this);
    btnCreateNew.setText("Create New User");
    btnCreateNew.offsetTopAndBottom(10);
    btnCreateNew.offsetLeftAndRight(10);
    RLayout.addView(btnCreateNew, p);
}

当然,您也可以直接在xml布局中添加按钮。我更喜欢这种方式,因为布局和代码之间有更好的分离。

基本 XML 结构(根据需要设置其样式(:

<RelativeLayout android:id="@+id/layout_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Button android:id="@+id/button_id"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="@string/button_text"/>
</RelativeLayout>

空白屏幕的原因是,您将按钮添加到新创建的RLayout但此布局从未成为屏幕的一部分(从未由setContentView()添加(

也许您可以尝试重新排列代码行。在主类中将Button btnCreateNew = new Button(this);更改为Button btnCreateNew;或者只是将整行移动到onCreate()中。你的错误在你的日志中说了什么?

thisgetApplicationContext() 之间有区别,请尝试将其更改为 getApplicationContext()

试试这个

public class register_activity extends Activity {
Button btnCreateNew;
@Override
public void onCreate(Bundle savedInstanceState) {
btnCreateNew = new Button(R.layout.register);
}

这应该有效。您没有指出按钮应从哪个 xml 中提取。

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 register_activity extends Activity {
Button btnCreateNew;
@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        RelativeLayout RLayout = (RelativeLayout) View.inflate(this, R.layout.register, null);
        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.FILL_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );
        btnCreateNew = new Button(this);
        btnCreateNew.setText("Create New User");
        btnCreateNew.offsetTopAndBottom(10);
        btnCreateNew.offsetLeftAndRight(10);
        RLayout.addView(btnCreateNew, p);
        setContentView(RLayout);
    }
}

最后,我所要做的就是重新设置contentView;我认为它必须是某种视图更新。

厉害!谢谢大家:)

最新更新