在没有XML的情况下以编程方式动态创建按钮和文本视图

时间:2020-09-20 20:42:43

标签: java android android-studio

我需要帮助来解决我的应用程序出了什么问题。对于使用Java的Android Studio类的作业,我们的任务是以编程方式构建不使用XML的简单应用程序。该应用程序的目标是动态创建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);”

1 个答案:

答案 0 :(得分:0)

我认为当您声明类型

    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中应为紫色。

相关问题