【问题标题】:Add imageview dynamically to existing view将 imageview 动态添加到现有视图
【发布时间】:2013-06-01 07:18:06
【问题描述】:

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

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

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

我该如何实现?
通过搜索,我发现它需要LayoutInflater.addView() 之类的东西thisLinearLayout.addView() 之类的this

但我不知道在我的情况下到底要使用什么。
另外,我不是想在按钮点击时添加一个单一的视图,而是一组特定的视图像imageview,2个textviews等。如 Image(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);
    }
}

它会产生这样的结果:

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

【问题讨论】:

    标签: android android-layout layout-inflater


    【解决方案1】:

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

    创建一个扩展 ArrayAdapter&lt;Integer&gt; 的类。在那里,创建一个interface 来创建一个监听器。

    public interface OnListButtonItemClickedListener{
    
       public int onListButonItemClicked(int position);
    
    }
    

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

    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>
    

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

    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();
    

    【讨论】:

    • 谢谢。 vh.b.setText(String.valueOf(getItem(i).intValue())); 中的 i 是什么??
    【解决方案2】:

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

    编辑:

    要确定单击了哪个按钮,您只需引用传递给您的addViews(View v) 方法的View。您可以打开 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 中的键,并使用字符串作为值。然后,您可以插入按钮,获取字符串并执行所需的任何操作。

    【讨论】:

    • 但是listview的每一行都是复合布局本身。
    【解决方案3】:

    也许你可以试试这个

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

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

    【讨论】:

    • 听起来是个好主意。一定会尝试并会让你知道。谢谢!
    【解决方案4】:

    因此,您可以像这样从 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 方向设置为垂直,否则它将无法按您的需要工作。

    【讨论】:

    • 请查看我的其他答案 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多