将imageview动态添加到现有视图

时间:2013-06-05 14:23:34

标签: android android-layout layout-inflater

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

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

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

如何实现这一目标?通过搜索,我发现它需要类似thisLayoutInflater.addView()this LinearLayout.addView()

但我不知道在我的情况下究竟要使用什么。
另外,我不打算在按钮点击时添加只是一个视图,但是一组确定图像视图,2文本视图等视图。如图像(2)所示。

任何帮助表示感谢。


screenshot


编辑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);
    }
}

产生类似这样的东西:

screenshot

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

4 个答案:

答案 0 :(得分:5)

因此,您可以从Activity这样的

中扩展XML布局中的视图

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

然后您可以将其添加到LinearLayout,如下所示:

linearLayout.addView(v);

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

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

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

请注意,您需要将LinearLayout方向设置为垂直方向,否则它将无法正常工作。

答案 1 :(得分: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();

答案 2 :(得分:1)

我不知道这是否适合您的应用目的,但尝试使用ListViewArrayAdapter。您将以XML中定义的空ListView开头,然后在代码中将项添加到已连接的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
    }
}

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

答案 3 :(得分:1)

也许你可以试试这个

  • 创建一个扩展LinearLayout的自定义视图,orientation:vertical。
  • 创建另一个自定义视图,此视图将为“行”。此视图是图像的容器,粗体文本和下面的文本。
  • 在第一个扩展linearLayout的自定义视图中,您可以添加View(View v)并传递另一个自定义视图,即行。
我清楚了吗?它与适配器和列表视图类似。