【问题标题】:Error creating Relative Layout using Java Code使用 Java 代码创建相对布局时出错
【发布时间】:2015-01-09 02:12:05
【问题描述】:

我是 android 开发新手,正在尝试使用 Java 代码创建 RelativeLayout。 下面是我的 MainActivty.java

package com.rt.droid.rellayoutjava;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.RelativeLayout.LayoutParams;

public class MainActivity extends Activity {
RelativeLayout r;
public static LayoutParams msgDim;
EditText userNameVal, passwordVal;
TextView message, userName, password;
Button login;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    init();
    createMessage();
    r.addView(message,msgDim);
    setContentView(r);
}

public void init() {
    r = new RelativeLayout(this);
    LayoutParams dimensions = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    r.setLayoutParams(dimensions);
    userNameVal = new EditText(this);
    passwordVal = new EditText(this);
    message=new TextView(this);
    userName = new TextView(this);
    password = new TextView(this);
    login = new Button(this);
}
public void createMessage(){
    LayoutParams msgDim = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    msgDim.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    message.setLayoutParams(msgDim);
    message.setText("Please login first");
    message.setTextColor(Color.rgb(0,0,0));

}

}

但是我得到了空指针异常(下面来自 Logcat)

 Process: com.rt.droid.rellayoutjava, PID: 2471
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rt.droid.rellayoutjava/com.rt.droid.rellayoutjava.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
 Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference
        at android.view.ViewGroup$LayoutParams.<init>(ViewGroup.java:6403)
        at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:6685)
        at android.widget.RelativeLayout$LayoutParams.<init>(RelativeLayout.java:1345)
        at android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:1104)
        at android.view.ViewGroup.addViewInner(ViewGroup.java:3889)
        at android.view.ViewGroup.addView(ViewGroup.java:3733)
        at android.view.ViewGroup.addView(ViewGroup.java:3709)
        at com.rt.droid.rellayoutjava.MainActivity.onCreate(MainActivity.java:24)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

任何指针将不胜感激。

【问题讨论】:

    标签: java android


    【解决方案1】:

    首先,我建议您使用 XML 文件来定义您的布局,而不是通过编程方式编写它们(您可以搜索任何类型的示例和教程)。

    无论如何,您的具体问题与未初始化的变量msgDim有关。将您的 onCreate() 更改为:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        createMessage();
        msgDim = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        r.addView(message,msgDim);
        setContentView(r);
    }
    

    【讨论】:

    • 感谢您的回复。首先,我知道 xml 是定义布局的更好方法,但这只是我尝试学习如何以编程方式执行相同操作。您的回复指出了答案,即我试图在 CreateMessage() 中创建另一个 msgDim 变量,即使我已经在程序开始时声明了它(全局变量)。非常感谢!这些类型的错误让初学者感到沮丧:)
    【解决方案2】:

    试试这个:

    r = new RelativeLayout(this);
    RelativeLayout.LayoutParams dimensions = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 
                                                                             RelativeLayout.LayoutParams.MATCH_PARENT);
    r.setLayoutParams(dimensions);
    

    这个问题下的第一个答案有更完整的代码:Programatically creating a RelativeLayout in Android

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多