【问题标题】:Add multiple custom views to layout programmatically以编程方式将多个自定义视图添加到布局
【发布时间】:2014-11-25 13:46:27
【问题描述】:

例如,如果我有这样的空布局:

layout1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
</LinearLayout>

还有一些类似这样的布局:

layout2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
 
    <TextView
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView 1" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 2" />
 
    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 3" 
        android:layout_weight="1"/>
 
</LinearLayout>

我想以编程方式将layout2.xml 添加到layout1.xml。我需要有多个不同的版本layout2.xml,我会在需要时添加它们。每个人在TextViewButtons 上都有不同的文字。

如果是普通的 Android View,我通常会像这样使用 addView

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv1 = new TextView(this);
    tv1.setText("HELLO");
    my_linear_layout.addView(tv1);

    Button btn2 = new Button(this);
    bt2.setText("WORLD");
    my_linear_layout.addView(btn2);
}

如果我没有像 TextViewButton 这样简单的东西,并且如果我定义了自己的 XML View,我该怎么办?

是否有可能以某种方式将所有视图放入适配器中,例如 ListView,然后在需要时获取它,然后在那些 Views 上调用 addView

【问题讨论】:

标签: android xml android-layout android-custom-view


【解决方案1】:

您可以扩充layout2.xml 文件,编辑文本并将其添加到第一个布局中:

public class MyActivity extends Activity {

    private ViewGroup mLinearLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);
        mLinearLayout = (ViewGroup) findViewById(R.id.linear_layout);
        addLayout("This is text 1", "This is first button", "This is second Button");
    }

    private void addLayout(String textViewText, String buttonText1, String buttonText2) {
        View layout2 = LayoutInflater.from(this).inflate(R.layout.layout2, mLinearLayout, false);

        TextView textView = (TextView) layout2.findViewById(R.id.button1);
        Button button1 = (Button) layout2.findViewById(R.id.button2);
        Button button2 = (Button) layout2.findViewById(R.id.button3);

        textView1.setText(textViewText);
        button1.setText(buttonText1);
        button2.setText(buttonText2);

        mLinearLayout.addView(layout2);
    }
}

您可能希望将layout2.xml 根视图的android:layout_height 更改为wrap_content

如果您使用 ViewBinding,下面是 addLayout 函数的样子:

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), mLinearLayout, false);
binding.getTextView1().setText(textViewText);
binding.getButton1().setText(buttonText1);
binding.getButton2().setText(buttonText2);

mLinearLayout.addView(binding.getRoot());

【讨论】:

  • 如何通过视图绑定来做到这一点?
  • @Patrick 检查编辑后的答案
  • 请看下面我的回答。
【解决方案2】:

layout1.xml 包含 ScrollView 作为父布局,主 LinearLayout 作为子布局,如果没有行项目更大的屏幕尺寸 ScrollView 使用滚动处理溢出项目:

layout1.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/my_linear_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    </LinearLayout>
</ScrollView>

使用LayoutInflater 将行项目添加到父LinearLayout

private LinearLayout my_linear_layout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);
    my_linear_layout = (LinearLayout) findViewById(R.id.my_linear_layout);

    for (int i = 1; i <= 5; i++) {
        View view = LayoutInflater.from(this).inflate(R.layout.layout2, null);
        TextView button1 = (TextView) view.findViewById(R.id.button1);
        Button button2 = (Button) view.findViewById(R.id.button2);
        TextView button3 = (TextView) view.findViewById(R.id.button3);

        button1.setText("HELLO " + i);
        button2.setText("HELLO " + i);
        button3.setText("HELLO " + i);
        my_linear_layout.addView(view);
    }
}

【讨论】:

  • 如何访问视图外的所有按钮?
  • 尝试从 my_linear_layout 获取子元素或添加所有按钮引用一个数组列表。
  • 指定孩子已经有父母请调用removeView()
【解决方案3】:

试试这个方法

id 添加到LinearLayout'layout1.xml':

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/firstlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

</LinearLayout>

onCreate:

LinearLayout firstlayout = (LinearLayout) findViewById(R.id.firstlayout);

LinearLayout secondlayoout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.layout2, null); // inflating view from xml
TextView btn1 = (TextView) secondlayoout.findViewById(R.id.button1);
btn1.setText("TEST");

firstlayout.addView(secondlayoout);

【讨论】:

    【解决方案4】:

    您可以通过以下方式实现视图绑定。

    val layoutBindingView: LayoutBinding =
                LayoutBinding.inflate(layoutInflater)
    layoutBindingView.textView.text = "TextOne"
    
    val layoutBindingView: LayoutBinding =
                LayoutBinding.inflate(layoutInflater)
    layoutBindingView.textView.text = "Text Two"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多