【问题标题】:Dynamically create buttons and text view programmatically without XML无需 XML 以编程方式动态创建按钮和文本视图
【发布时间】:2020-09-21 04:48:43
【问题描述】:

我需要帮助解决我的应用程序出了什么问题。对于我的带有 Java 的 Android Studio 类的作业,我们的任务是在不使用 XML 的情况下以编程方式构建一个简单的应用程序。该应用程序的目标是动态创建 3 个按钮,当您单击一个按钮时,会生成一个文本视图来显示与该按钮相关的消息。我已将所有内容都编码到应用程序将启动和运行的位置,但是每当我单击 3 个按钮之一时,我的应用程序就会崩溃,说明:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.missouristate.calebcase.shadesv1, PID: 24474
    java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.constraintlayout.widget.ConstraintLayout.addView(android.view.View)' on a null object reference
        at com.missouristate.calebcase.shadesv1.MainActivity$1.onClick(MainActivity.java:107)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

这是我用来开发应用程序的代码:

    import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import static com.missouristate.calebcase.shadesv1.R.*;

public class MainActivity extends AppCompatActivity {
    private ConstraintSet set;
    private ConstraintLayout layout;
    private Button goldButton;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.CL_1);
        layout.setBackgroundColor(Color.parseColor("#c89b6d"));

        ConstraintSet set = new ConstraintSet();
        set.clone(layout);


        //Button 1:
        Button plumButton = new Button(this);
        plumButton.setText(getString(string.plum));
        plumButton.setId(View.generateViewId());           // <-- Important
        plumButton.setTag("btn1");
        plumButton.setBackgroundColor(Color.parseColor("#ac7d50"));
        plumButton.setOnClickListener(ShadeChangeListener);
        layout.addView(plumButton);
        set.connect(plumButton.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 50);
        set.connect(plumButton.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0);
        set.connect(plumButton.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0);
        set.constrainHeight(plumButton.getId(), 200);
        set.applyTo(layout);


        //Button 2:
        Button blueButton = new Button(this);
        blueButton.setText(getString(string.blue));
        blueButton.setId(View.generateViewId());
        blueButton.setTag("btn2");
        blueButton.setBackgroundColor(Color.parseColor("#ac7d50"));
        blueButton.setOnClickListener(ShadeChangeListener);
        layout.addView(blueButton);
        set.connect(blueButton.getId(), ConstraintSet.TOP, plumButton.getId(), ConstraintSet.BOTTOM, 10);
        set.connect(blueButton.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0);
        set.connect(blueButton.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0);
        set.constrainHeight(blueButton.getId(), 200);
        set.applyTo(layout);

        //Button 3:
        Button goldButton = new Button(this);
        goldButton.setText(getString(string.gold));
        goldButton.setId(View.generateViewId());
        goldButton.setTag("btn3");
        goldButton.setBackgroundColor(Color.parseColor("#ac7d50"));
        goldButton.setOnClickListener(ShadeChangeListener);
        layout.addView(goldButton);
        set.connect(goldButton.getId(), ConstraintSet.TOP, blueButton.getId(), ConstraintSet.BOTTOM, 10);
        set.connect(goldButton.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0);
        set.connect(goldButton.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0);
        set.constrainHeight(goldButton.getId(), 200);
        set.applyTo(layout);

    }

    private final View.OnClickListener ShadeChangeListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String description = (String) view.getTag();
            // Create a text view programmatically


            TextView textView = new TextView(MainActivity.this);
            textView.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            textView.setGravity(Gravity.CENTER);

            textView.setBackgroundColor(Color.parseColor("#ac7d50"));
            textView.setId(View.generateViewId());


            switch ((String) view.getTag()) {
                case "btn1":
                    textView.setText(string.plum_is);
                    break;
                case "btn2":
                    textView.setText(string.blue_is);
                    break;
                case "btn3":
                    textView.setText(string.gold_is);
                    break;
            }

            layout.addView(textView);

            set.connect(textView.getId(), ConstraintSet.TOP, goldButton.getId(), ConstraintSet.BOTTOM, 50);
            set.connect(textView.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
            set.connect(textView.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 0);
            set.constrainHeight(textView.getId(), 400);
            set.applyTo(layout);

        }
    };

}

任何帮助将不胜感激!另外,第 107 行引用了这一行“layout.addView(textView);”

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    我想当你声明的类型时

        ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.CL_1);
        layout.setBackgroundColor(Color.parseColor("#c89b6d"));
    
        ConstraintSet set = new ConstraintSet();
        set.clone(layout);
    

    在您的函数内部,您正在创建本地函数,而您在类顶部声明的函数仍然是null。试试看;

        layout = (ConstraintLayout) findViewById(R.id.CL_1);
        layout.setBackgroundColor(Color.parseColor("#c89b6d"));
    
        set = new ConstraintSet();
        set.clone(layout);
    

    layoutset 在 Android Studio 中应该是紫色的。

    【讨论】:

    • 这适用于布局和设置,但我也调用了 goldButton,它也设置为 null。我将如何通过那个?
    • Button goldButton 你的函数中删除Button。它也在当地被宣布。如果你在类中全局声明一个变量,你在使用它时不需要再次声明它的类型。
    猜你喜欢
    • 2017-05-23
    • 2020-10-26
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多