用户界面——Android中gui元素的动态数量



我想为android创建一个gui应用程序,其中用户将能够添加或删除某些类型的字段(4种不同类型的字段)到应用程序。在xml中有这样做的方法吗?

我能想到这样做的唯一方法是从应用程序中编辑xml文件,这听起来对我来说是个坏主意。

希望我的问题是清楚的。

Yotam .

编辑:

我已经添加了一个简单的代码直接java植入:

进口android.app.Activity;进口android.graphics.Color;进口android.os.Bundle;进口android.view.ViewGroup;进口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);
}

您也可以在处理程序中(在实现类中)这样做。

扩展xml布局后,响应某种用户交互。在处理程序中

  • 创建一个新的View from划痕,并指定其layoutparams,
  • 或使用xml
  • 扩展

拥有新视图后,将其添加到当前(this)视图,并且由于其layoutparams,它将是您想要的大小,形状,颜色等。

更新:

如果你想在你的活动中添加更复杂的视图,最好是用xml编写它们,并将它们膨胀:

sample_component.xml://inside 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活动类中,你有处理程序,必须通过向视图添加/删除项目来响应不同的用户操作。下面是一个点击事件的示例处理程序,它使用LayoutInflatersample_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类中(声明为内联类),它将识别它。

您可以动态地创建元素并将其添加到UI中,而不是在XML中指定元素。这在Android Hello World教程中有演示。

相关内容

  • 没有找到相关文章

最新更新