【问题标题】:Layout Params below doesn't work programmatically下面的布局参数不能以编程方式工作
【发布时间】:2016-03-22 21:01:05
【问题描述】:

我正在尝试在下面添加一条规则以将 TextView 放在另一个下方,但我无法以编程方式进行操作。 我有一个这样的 XML:

        <android.support.v7.widget.CardView
            xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:id="@+id/card_view"
            android:layout_gravity="center"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            card_view:cardCornerRadius="4dp"
            card_view:cardBackgroundColor="#00bcd4">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin">

                <TextView
                    android:id="@+id/info_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Category Name"
                    style="@style/Base.TextAppearance.AppCompat.Title"
                    android:paddingBottom="@dimen/activity_vertical_margin"
                    android:layout_centerHorizontal="true" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="Vel voluptatem soluta ipsa. Voluptatem est quod non explicabo aut quisquam quas. Voluptatem aliquam iure voluptas"
                    android:id="@+id/textView"
                    android:paddingBottom="@dimen/activity_vertical_margin"
                    android:layout_below="@+id/info_text"
                    android:layout_above="@+id/button"/>

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Help"
                    android:id="@+id/button"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentEnd="true" />

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Play"
                    android:id="@+id/button2"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentStart="true" />

            </RelativeLayout>
        </android.support.v7.widget.CardView>

    </LinearLayout>

这很好用!我得到了我想要的结果:一个带有类别名称、描述和 2 个按钮的 CardView。
所以我尝试在 Java 中转置这个 XML,因为我有很多类别要显示。我确实喜欢这样:

    LinearLayout linearLayoutCategory = (LinearLayout) findViewById(R.id.linearLayoutCategory);
    for (int i = 0; i < categories.size(); i++) {
        Category category = categories.get(i);
        CardView cardView = new CardView(this);
        cardView.setCardBackgroundColor(Color.parseColor("#00bcd4"));
        cardView.setRadius((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics()));
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics()), Gravity.CENTER);
        layoutParams.setMargins(0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()), 0, 0);
        cardView.setLayoutParams(layoutParams);

        RelativeLayout relativeLayout = new RelativeLayout(this);
        RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        relativeLayout.setLayoutParams(layoutParams1);

        TextView textView = new TextView(this);
        RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams2.addRule(RelativeLayout.CENTER_HORIZONTAL);
        textView.setLayoutParams(layoutParams2);
        textView.setText(category.getName());
        textView.setTextAppearance(this, android.R.style.TextAppearance_Large);
        textView.setId(i);
        relativeLayout.addView(textView);

        TextView textView1 = new TextView(this);
        RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        layoutParams3.addRule(RelativeLayout.BELOW, textView.getId());
        textView1.setLayoutParams(layoutParams3);
        textView1.setText(category.getDescription());
        relativeLayout.addView(textView1);

        Button button = new Button(this);
        relativeLayout.addView(button);

        Button button1 = new Button(this);
        relativeLayout.addView(button1);

        cardView.addView(relativeLayout);
        linearLayoutCategory.addView(cardView);
    }

这会创建很多具有良好定位类别名称 (textView) 的 CardView,但我无法定位类别描述。此行看起来对 textView1 没有任何影响(对应于类别描述):

     layoutParams3.addRule(RelativeLayout.BELOW, textView.getId());

我不明白,因为类别名称的位置很好,而且我使用了相同的技术:addRule。
我是否忘记了什么或犯了一个错误?
这是一个picture 向您展示两个结果
提前致谢。

【问题讨论】:

    标签: android android-linearlayout android-cardview layoutparams


    【解决方案1】:

    问题是你的规则是基于TextView id的:

    layoutParams3.addRule(RelativeLayout.BELOW, textView.getId());
    

    但是,由于您是从代码创建 TextView,它没有分配任何 ID。在 XML 中,您的 TextView 具有 id android:id="@+id/info_text",这就是它在 XML 中正常工作的原因。

    您实际上并不需要将您的 XML 布局转换为代码 - 您需要的只是为每个类别扩展布局并将结果添加到容器中(我相信您使用垂直 LinearLayout 作为您的类别的容器):

    main_layout:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/linearLayoutCategory"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    

    category.xml:

        <?xml version="1.0" encoding="utf-8"?>
        <android.support.v7.widget.CardView
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:id="@+id/card_view"
            android:layout_gravity="center"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            card_view:cardCornerRadius="4dp"
            card_view:cardBackgroundColor="#00bcd4">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin">
    
                <TextView
                    android:id="@+id/info_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Category Name"
                    style="@style/Base.TextAppearance.AppCompat.Title"
                    android:paddingBottom="@dimen/activity_vertical_margin"
                    android:layout_centerHorizontal="true" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="Vel voluptatem soluta ipsa. Voluptatem est quod non explicabo aut quisquam quas. Voluptatem aliquam iure voluptas"
                    android:id="@+id/textView"
                    android:paddingBottom="@dimen/activity_vertical_margin"
                    android:layout_below="@+id/info_text"
                    android:layout_above="@+id/button"/>
    
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Help"
                    android:id="@+id/button"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentEnd="true" />
    
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Play"
                    android:id="@+id/button2"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentStart="true" />
    
            </RelativeLayout>
        </android.support.v7.widget.CardView>
    

    业务逻辑:

    LinearLayout linearLayoutCategory = (LinearLayout)findViewById(R.id.linearLayoutCategory);
    for (int i = 0; i < categories.size(); i++) {
        View category = getLayoutInflater().inflate(R.layout.category, linearLayoutCategory, false);
    
        TextView infoText = category.findViewById(R.id.info_text);
        infoText.setText(/*category name?*/);
    
        linearLayoutCategory.addView(category);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      相关资源
      最近更新 更多