我正在开发一款应用程序,在启动时会在下面的屏幕截图中显示预定义的布局,例如 Image(1)。
现在点击一个按钮,我想动态地将下面屏幕截图中的图像(2)等另一个视图添加到现有视图中,从而产生一些类似 Image(3)的视图在屏幕截图下方。
如果再次单击onclick,图像(2)将添加到现有视图中,从而产生类似图像(4)的内容。
如何实现这一目标?通过搜索,我发现它需要类似this的LayoutInflater.addView()
或this LinearLayout.addView()
。
但我不知道在我的情况下究竟要使用什么。
另外,我不打算在按钮点击时添加只是一个视图,但是一组确定图像视图,2文本视图等视图。如图像(2)所示。
任何帮助表示感谢。
我试过这样的事情: 的 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);
}
}
产生类似这样的东西:
现在,如何识别点击了哪个按钮?
答案 0 :(得分:5)
因此,您可以从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方向设置为垂直方向,否则它将无法正常工作。
答案 1 :(得分:2)
您可以做很多事情来实现这一目标,但最好的方法可能是使用ListView
和ArrayAdapter
创建一个扩展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)
我不知道这是否适合您的应用目的,但尝试使用ListView
和ArrayAdapter
。您将以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)
也许你可以试试这个