我想为android创建一个gui应用程序,用户可以在该应用程序中添加或删除某种类型的字段(4种不同类型的字段)。有没有办法在xml中这样做?
我能想到的唯一方法是从应用程序中编辑xml文件,这对我来说听起来不错。
希望我的问题很明确。
Yotam。
编辑:
我添加了一个简单的直接java植入代码:
import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.ViewGroup; import android.widget.TextView;
public class Leonidas extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.counter);
TextView TV = new TextView (this);
TextView UV = new TextView (this);
TV.setText("hello");
UV.setText("goof");
//setContentView(TV);
//setContentView(UV);
ViewGroup.LayoutParams lpars = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
this.addContentView(UV,lpars);
this.addContentView(TV, lpars);
this.setVisible(true);
}
}
EDIT2:
我搜索了一些例子并得到了以下工作:
LayoutInflater inflater;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater = LayoutInflater.from(this);
Button b = (Button) this.findViewById(R.id.alert);
b.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final LinearLayout canvas = (LinearLayout)Leonidas.this.findViewById(R.id.counter_field);
final View cv = this.inflater.inflate(R.layout.counter,canvas,false);
canvas.addView(cv);
}
答案 0 :(得分:2)
您也可以在处理程序中执行此操作(在实现类中)。
在对xml布局进行充气后,您会响应某种用户交互。 在处理程序中
layoutparams
,获得新视图后,将其添加到当前(this
)视图中,由于其布局框架,它将是您想要的大小,形状,颜色等。
更新:
如果您想为活动添加更复杂的视图,最好在xml中编写它们,然后给它们充气:
sample_component.xml://在res / layout
中<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:padding="0px">
<TextView android:id="@+id/servicename_status" android:paddingLeft="15px"
android:paddingRight="5px"
android:textStyle="bold" android:focusable="false" android:textSize="14px"
android:layout_marginLeft="10px" android:layout_marginRight="3px"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
<TextView android:id="@+id/lastcheck" android:focusable="false"
android:textSize="14px" android:layout_width="fill_parent"
android:layout_marginLeft="10px" android:layout_marginRight="3px"
android:layout_height="wrap_content" android:layout_below="@id/servicename_status" />
<TextView android:id="@+id/duration" android:focusable="false"
android:textSize="14px" android:layout_width="fill_parent"
android:layout_marginLeft="10px" android:layout_marginRight="3px"
android:layout_height="wrap_content" android:layout_below="@id/lastcheck" />
<TextView android:id="@+id/attempt" android:focusable="false"
android:textSize="14px" android:layout_width="fill_parent"
android:layout_marginLeft="10px" android:layout_marginRight="3px"
android:layout_height="wrap_content" android:layout_below="@id/duration" />
<TextView android:id="@+id/statusinfo" android:focusable="false"
android:textSize="14px" android:layout_width="fill_parent"
android:layout_marginLeft="10px" android:layout_marginRight="3px"
android:layout_height="wrap_content" android:layout_below="@id/attempt" />
<CheckBox android:id="@+id/alert" android:focusable="false"
android:layout_alignParentRight="true" android:freezesText="false"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5px" />
</RelativeLayout>
在Leonidas
活动类中,您有处理程序必须通过在视图中添加/删除项目来响应不同的用户操作。
以下是点击事件的示例处理程序,该事件使用LayoutInflater
将sample_component.xml
视图添加到您的活动中:
public final class MyClickListener implements View.OnClickListener
{
private LayoutInflater inflater;
public MyClickListener()
{
inflater = LayoutInflater.from(Leonidas .this);
}
@Override
public void onClick(View v)
{
// TODO: change RelativeLayout here to whatever layout
// you'd like to add the new components to
final RelativeLayout canvas = (RelativeLayout)Leonidas.this.findViewById(R.id.my_canvas);
final View childView = inflater.inflate(R.layout.sample_component, canvas, false);
// TODO: Look up the 5 different signatures of the addView method,
// and pick that best fits your needs
canvas.addView(childView);
// check which button was pressed
switch (view.getId())
{
case R.id.btn_prev:
//handler for the prev button
break;
case R.id.btn_next:
//handler for the next button
break;
default:
break;
}
}
}
请注意,MyClickListener是作为Leonidas活动中的内联类实现的,这就是使用context
参数的原因:this.Leonidas
。
<强>更新强>
R.id.my_canvas将是您要添加组件的视图的ID。它位于你的main.xml中(或者你用于Leonidas视图的任何xml)。
如果将MyClickListener类放在Leonidas.java类中(声明为内联类),它将识别它。
答案 1 :(得分:1)
您可以动态创建它们并将其添加到UI,而不是在XML中指定元素。这在Android Hello World Tutorial here中得到了证明。