0

我正在制作一个简单的计算器,并在运行时通过 java 动态添加按钮

我的 Java 文件是

package com.example.calculator;

import android.os.Bundle;
import android.app.Activity;
import android.view.*;
import android.widget.*;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {

    Button [] button = new Button[17];
    TextView input_field = new TextView(null);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.setlayout();        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void setlayout(){

        Display display = getWindowManager().getDefaultDisplay(); 
        int width = display.getWidth();
        int height = display.getHeight();
        int x = 4;
        height -= x ;
        input_field.setHeight(x);
        input_field.setWidth((width-x));
        height /= 4;
        width /= 4;
        for(int i=0;i<16;i++)
            {   
                button [i] = new Button(null);
                button[i].setHeight(height);
                button[i].setWidth(width);
            }
        button [16] = new Button(null); 
        button[16].setHeight(x);
        button[16].setWidth(x);

        LinearLayout top = new LinearLayout(null);
        top.addView(input_field);
        top.addView(button[16]);

        LinearLayout row1 = new LinearLayout(null);
        row1.addView(button[8]);
        row1.addView(button[9]);
        row1.addView(button[10]);
        row1.addView(button[12]);

        LinearLayout row2 = new LinearLayout(null);
        row2.addView(button[7]);
        row2.addView(button[6]);
        row2.addView(button[5]);
        row2.addView(button[13]);

        LinearLayout row3 = new LinearLayout(null);
        row3.addView(button[4]);
        row3.addView(button[3]);
        row3.addView(button[2]);
        row3.addView(button[14]);

        LinearLayout row4 = new LinearLayout(null);
        row4.addView(button[0]);
        row4.addView(button[1]);
        row4.addView(button[11]);
        row4.addView(button[15]);

        LinearLayout main = (LinearLayout) findViewById(R.id.main_layout);

        main.setVisibility(1);
        main.setOrientation(1);
        main.addView(top);
        main.addView(row1);
        main.addView(row2);
        main.addView(row3);
        main.addView(row4);

        main.setVisibility(0);
    }
}

这是我的 XML 文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


</LinearLayout>

这是我的 logCat 错误

07-22 12:58:42.725: E/AndroidRuntime(29430): FATAL EXCEPTION: main
07-22 12:58:42.725: E/AndroidRuntime(29430): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.calculator/com.example.calculator.MainActivity}: java.lang.NullPointerException
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2675)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread.access$2500(ActivityThread.java:129)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2117)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.os.Looper.loop(Looper.java:143)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread.main(ActivityThread.java:4717)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at java.lang.reflect.Method.invokeNative(Native Method)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at java.lang.reflect.Method.invoke(Method.java:521)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at dalvik.system.NativeStart.main(Native Method)
07-22 12:58:42.725: E/AndroidRuntime(29430): Caused by: java.lang.NullPointerException
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.view.ViewConfiguration.get(ViewConfiguration.java:216)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.view.View.<init>(View.java:1826)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.view.View.<init>(View.java:1873)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.widget.TextView.<init>(TextView.java:432)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.widget.TextView.<init>(TextView.java:426)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.widget.TextView.<init>(TextView.java:421)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at com.example.calculator.MainActivity.<init>(MainActivity.java:12)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at java.lang.Class.newInstanceImpl(Native Method)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at java.lang.Class.newInstance(Class.java:1429)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
07-22 12:58:42.725: E/AndroidRuntime(29430):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2667)
07-22 12:58:42.725: E/AndroidRuntime(29430):    ... 11 more
4

4 回答 4

2

为什么将 null 传递给 LinearLayout?它要求您将活动的上下文传递给它(在您的情况下是this)。对于按钮和您选择在代码中动态创建的任何其他视图也是如此。

另外,看看这个答案,因为我怀疑一旦你用 替换所有空值,你就会遇到另一个问题this,这就是你的视图不知道有多宽或多高的问题...... 在 a 中设置边距以编程方式线性布局

于 2012-07-22T07:36:58.570 回答
1

尝试改变

TextView input_field = new TextView(null);

private TextView input_field = new TextView(MainActivity.this);
于 2012-07-22T07:44:31.367 回答
0

最后应该调用 setContextView 。尝试先执行 setLayout 并在 LinearLayout 类型的“主”对象上调用 SetContextView。

另外,您可以发布引发错误的哪一行?

于 2012-07-22T07:38:41.503 回答
0

在这里,您有从按钮 [0] 到按钮 [16] 的按钮数组

然后将 for 循环从 i<16 更改为 i<=16

for(int i=0;i<=16;i++)

于 2012-08-03T03:10:20.187 回答