每当我创建一个新按钮时,我的app力就会关闭

时间:2011-12-27 02:02:54

标签: android layout button dynamic view

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);

    }
}

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

有什么问题?

5 个答案:

答案 0 :(得分:1)

你有一个NullPointerException,对吗? (检查你的LogCat!)

原因:

  1. 您可以使用this作为参数创建Button作为成员变量。这可能会导致一些问题,因为调用this时可能无法定义new Button(this)。将初始化移至onCreate

  2. 您的RLayout将为空,我非常确定。原因是,在致电findViewById()之前,您无法致电setContentView()。如果您之前调用它,Android不知道在哪里查看并返回null。

  3. 更新

    当你更改问题时,这是我更新的答案:

    您将内容设置为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()

答案 1 :(得分:0)

也许您可以尝试重新排列代码行。在主要课程中将Button btnCreateNew = new Button(this);更改为Button btnCreateNew;或者只需将整行移至onCreate()。你的错误在你的logcat中说了什么?

答案 2 :(得分:0)

thisgetApplicationContext()之间存在差异,请尝试将其更改为getApplicationContext()

答案 3 :(得分:0)

试试这个

public class register_activity extends Activity {

Button btnCreateNew;

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

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

答案 4 :(得分:0)

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;我认为它必须是某种视图更新。

真棒!谢谢大家:)