1

我正在开发一个应用程序,它在启动时会在下面的屏幕截图中显示预定义的布局,如Image(1) 。

现在点击一个按钮,我想动态添加另一个视图,如下面屏幕截图中的Image(2)到现有视图,从而生成一些类似下面屏幕截图中的Image(3)的视图。

如果再次单击 onclick,则Image(2)将添加到现有视图中,从而生成类似于Image(4)的内容。

我如何实现这一目标?
通过搜索,我发现它需要LayoutInflater.addView()类似thisLinearLayout.addView()like this的东西。

但我不知道在我的情况下到底要使用什么。
此外,我不想在按钮单击时添加一个视图,而是添加一组特定视图,如 imageview、2 个 textview 等。如图(2)所示。

任何帮助表示赞赏。


截屏


编辑1:

我试过这样的东西: activity_main.xml

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

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

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/hello_world" />
        </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="20dp"
        android:onClick="addViews"
        android:text="Add" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {
    LinearLayout main;
    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main = (LinearLayout) findViewById(R.id.main);
    }

    public void addViews(View view) {
        LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        Button btn = new Button(this);
        btn.setLayoutParams(lparams);
        count++;
        btn.setText("Hello World : " + count);
        main.addView(btn, count);
    }
}

它产生这样的东西:

截屏

现在,我如何识别单击了哪个按钮?

4

4 回答 4

5

因此,您可以从这样的 XML 布局中扩展Activity视图

View v = View.inflate(this, R.layout.whatever, null);

然后你可以LinearLayout像这样将它添加到你的:

linearLayout.addView(v);

如果要访问项目中的内部视图,可以这样做:

TextView textView = (TextView) v.findViewById(R.id.textView1);

因此,您必须在 XML 布局中定义该组视图,对其进行扩展,根据需要操作其视图,然后将其添加到您的LinearLayout.

请注意,您需要 LinearLayout 方向是垂直的,否则它将无法按您的需要工作。

于 2013-06-05T14:29:56.660 回答
2

你可以做很多事情来让它发挥作用,但最好的方法是使用ListViewArrayAdapter

创建一个扩展类ArrayAdapter<Integer>。在那里,创建一个interface来创建一个监听器。

public interface OnListButtonItemClickedListener{

   public int onListButonItemClicked(int position);

}

OnListButtonItemClickedListener在您的 上定义一个私有ArrayAdapter,并创建一个公共设置器。

private OnListButtonItemClickedListener listener;

public void setOnListButtonItemClickedListener(OnListButtonItemClickedListener listener){
    this.listener = listener;
}

在 XML 布局中定义一个按钮。这样的事情会做:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dip" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>

ViewHolder在你的类中创建一个内部类,ArrayAdapter如下所示:

private class ViewHolder{
    public Button b;
}

覆盖getView并创建如下内容:

@Override
public View getView(final int position, View convertView, ViewGroup parent){
        ViewHandler vh;
        if (convertView == null){
            convertView = View.inflate(getContext(), R.layout.your_layout, null);
            vh = new ViewHolder();
            vh.b = (Button) convertView.findViewById(R.id.button1);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.b.setText(String.valueOf(getItem(i).intValue()));
        vh.b.setOnClickListener(new OnClickListener(){

            public void onClick(View v){
                if (listener != null){
                    listener.onListButonItemClicked(getItem(position).intValue());
                }
            }

        });
        return convertView;
    }

将适配器设置为 ListView,当您想添加一个新的时,只需执行以下操作:

adapter.add(i);
adapter.notifyDataSetChanged();
于 2013-06-05T15:15:12.650 回答
1

也许你可以试试这个

  • 创建一个扩展 LinearLayout 的自定义视图,方向:垂直。
  • 创建另一个自定义视图,此视图将是“行”。此视图是图像、粗体文本和下方文本的容器。
  • 在扩展 linearLayout 的第一个自定义视图中,您可以 addView(View v) 并传递另一个自定义视图,即行。

我清楚了吗?适配器和列表视图的工作方式类似。

于 2013-06-05T14:33:26.417 回答
1

我不知道这是否符合您应用程序的目的,但请尝试使用 aListViewArrayAdapter. 您将从ListViewXML 中定义的空 开始,然后将项目添加到连接ArrayAdapter的代码中。每次按下按钮时,您都可以将图像添加到ArrayAdapter并调用.notifyDataSetChanged()。这应该将它们堆叠起来,如上图所示。您还可以使用辅助LinearLayout项对项目进行分组。

编辑:

要确定单击哪个按钮,您只需引用View传递给您的addViews(View v)方法。您可以打开 id:

public void addViews(View v){
    int id = v.getId();
    switch(id){
        case R.id.id1:
            //do something
        case R.id.id2:
            //do something
     }
}

或者,您可以使用以下类似方式从按钮获取文本:

public void addViews(View v){
    Button b = (Button)v; //make sure you know that it will be a button
    String s = b.getText().toString();
    switch(s){
        case "test case 1":
            //do something
        case "test case 2":
            //do something
    }
}

如果您不确定会有多少按钮,我建议您使用字符串方法。如果按钮没有便于以这种方式解析的名称,则将对按钮的引用存储为 HashMap 中的键,并使用字符串作为值。然后,您可以插入按钮,获取字符串并执行所需的任何操作。

于 2013-06-05T14:30:44.620 回答