如何以编程方式添加TextView并在布局中对齐它们

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式添加TextView并在布局中对齐它们相关的知识,希望对你有一定的参考价值。

我想创建一些TextViews(和Buttons),然后将它们放在ConstraintLayout中的RelativeLayout上(也可以是LinearLayout或任何可以工作的其他东西)......我的目标是为每个按钮添加一个textview左边的它们和它们布局中的中心。 (多数民众赞成我正在尝试使用Layoutparams)。但为什么我得到NullPointer异常?

XML布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/welcomeiqlinear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.william.httprequest.Welcome_InitialQuestions">

<TextView
    android:id="@+id/textView14"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="16dp"
    android:text="@string/wilkommen"
    android:textAlignment="center"
    android:textSize="35sp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/textView28"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="24dp"
    android:text="@string/wilkommen_t1"
    android:textAlignment="center"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView14" />

<Button
    android:id="@+id/startinitialbtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:backgroundTint="@color/aqua"
    android:elevation="0dp"
    android:text="@string/start_btn"
    android:textColor="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent" />

<RelativeLayout
    android:id="@+id/onetimerelative"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toTopOf="@+id/startinitialbtn"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView28"
    app:layout_constraintVertical_bias="1.0">

</RelativeLayout>

</android.support.constraint.ConstraintLayout>

Java代码:

@Override
        public void onResponse(String response) {

            //Log.i(TAG, "MY_PROFILE_DATA: "+ response);

            studiesList = new LinkedList<String>();

            try {
                JSONObject jsonObject1 = new JSONObject(response);
                JSONArray jArray = jsonObject1.getJSONArray("data");

                if (jArray != null) {
                    for (int i = 0; i < jArray.length(); i++) {
                        studiesList.add(jArray.getString(i));
                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            Iterator<String> itr=studiesList.iterator();
            //Log.i(TAG,"Questionnaire_DATA: "+ studiesList.toString());
            int i = 1;
            while(itr.hasNext())
            {
                if(i==1) {

                    Log.i(TAG, "Questionnaire_DATA: " + itr.next());

                    //add textViews
                    TextView textView = new 
                    TextView(getApplicationContext());

                    textView.setText("Fragebogen " + i);


                    //add buttons
                    Button button = new Button(getApplicationContext());
                    button.setText("Offen");
                    button.setId(i);

                    RelativeLayout.LayoutParams lp = 
                   (RelativeLayout.LayoutParams) 
                    otrelativeLayout.getLayoutParams();
                    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
                    lp.addRule(RelativeLayout.RIGHT_OF, button.getId());
                    lp.addRule(RelativeLayout.ALIGN_BASELINE, button.getId());

                    textView.setLayoutParams(lp);

                    otrelativeLayout.addView(button);
                    otrelativeLayout.addView(textView);
                    i++;
                } else {





                }
            }

错误:

FATAL EXCEPTION: main

Process: com.example.william.httprequest, PID: 26073

java.lang.ClassCastException: 
android.support.constraint.ConstraintLayout$LayoutParams cannot be cast to 
android.widget.RelativeLayout$LayoutParams

我真的很感激任何帮助:)

答案

View.getLayoutParams()的Android文档声明返回的布局参数提供给此View的父级。这解释了ClassCastException:当你在getLayoutParams()上调用RelativeLayout时,你正在检索布局参数,这些参数描述了它应该如何在其父级ConstraintLayout中布局,因此是ConstraintLayout.LayoutParams的一个实例。

您必须为每个RelativeLayout.LayoutParamsTextView实例化一个新的Button,您想要添加为RelativeLayout的子项,配置其参数,使用View.setLayoutParams(ViewGroupe.LayoutParams)设置它,然后将新创建的View添加到其RelativeLayout父级。

以上是关于如何以编程方式添加TextView并在布局中对齐它们的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在TextView中设置文本对齐方式

以编程方式设置 TextView 的布局权重

以编程方式设置TextView的布局权重

以编程方式动态 textview 的文本更改布局中的其他视图,我不希望它

如何以编程方式在顶部和底部的垂直线性布局中设置一个视图?

如何以编程方式将视图从XML添加到布局?