【问题标题】:Duplicating an element when a button is pressed按下按钮时复制元素
【发布时间】:2019-01-12 11:08:12
【问题描述】:

是否可以通过按下按钮来复制元素(例如我的活动屏幕上已有的微调器)?而且我可以同时使用这两个微调器并添加任意数量的微调器?

【问题讨论】:

  • 如果您指的是描述布局的 XML,答案是否定的。这些文件是不可变的。但是,您可以以编程方式将视图添加到您的布局中。请说明你真正想做的事情。
  • 对不起,我可能解释得很糟糕。例如,我有一个微调器,当我按下一个显示“添加”的按钮时,该微调器将被复制,我将能够同时使用两者。

标签: android xml


【解决方案1】:

此代码向您展示如何以编程方式创建微调器并将其添加到 LinearLayout。

您可以调用 makeSpinner 方法并获得一个重复的微调器。

然后通过调用 addView 方法将其作为子视图添加到您的 ViewGroup 中。

提示:您应该存储添加的微调器的参考,以便以后访问它们。我将它们存储在 mSpinner 中。

public class MainActivity extends AppCompatActivity {

private LinearLayout mLinearLayout;

private ArrayList<Spinner> mSpinners;     // to hold reference of added spinner for reading purposes

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

    mSpinners = new ArrayList<>();

    mLinearLayout = findViewById(R.id.my_linearLayout);

    mLinearLayout.addView(makeSpinner());    // First spinner

    Button duplicateSpinner = findViewById(R.id.bt_duplicate);
    duplicateSpinner.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Spinner spinner = makeSpinner();
            mLinearLayout.addView(spinner);      // Add another spinner

        }
    });

    Button getSpinner = findViewById(R.id.bt_getSpinner);
    getSpinner.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            for (int i = 0; i < mSpinners.size(); i++) {      // Read all spinners
                Spinner spinner = mSpinners.get(i);
                Log.i("TAG", spinner.getSelectedItem().toString());
            }
        }
    });
}


private Spinner makeSpinner() {
    Spinner spinner = new Spinner(this, Spinner.MODE_DROPDOWN);

    // Setup layout
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    spinner.setLayoutParams(layoutParams);

    // Prepare data
    ArrayList<String> data = new ArrayList<>(); // change it based on your code
    data.add("Item 1");
    data.add("Item 2");

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, data);

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinner.setAdapter(adapter);

    mSpinners.add(spinner);     // store it 

    return spinner;
}
}

这是activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_linearLayout"
android:orientation="vertical"
tools:context="com.khahani.app.stack.MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bt_duplicate"
    android:text="Duplicate"/>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bt_getSpinner"
    android:text="Get Selected Item"/>

 </LinearLayout>

尽情享受吧。

【讨论】:

  • 如果只保留对 Spinner 的引用,则根本不需要 id。
  • 你是对的。我更改了示例代码。谢谢@Code-Apprentice
  • 当我在我的代码中尝试时,它给了我错误:错误:预期的类、接口或枚举
  • 您没有正确使用代码。看看这个:link
  • @crazyCoderN 如果您在尝试此解决方案后还有其他问题,您应该发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2011-06-30
  • 1970-01-01
  • 2021-11-10
  • 2020-05-22
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多