如何动态创建按钮?

时间:2012-05-11 19:35:30

标签: android android-layout android-button

我知道有很多人问过这个问题,但我的问题有所不同:

我已经在xml中使用了一个布局(使用制表符),但我需要根据字符串的读数创建按钮。

例如: 查询返回四个单词。我需要创建四个按钮,点击时会出现一个带有单词的祝词。

注意:我不知道会找到多少单词。

代码看起来像:

    while (Content.indexOf("<glossary>") != -1) {
        Content = Content.substring(Content.indexOf("<glossary>") + 9);
        //create button with name "Content"
    }

编辑:

查看我的新代码,只创建一个Button:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.showphyto);
    intent = getIntent();
    Title = intent.getStringExtra("Title");
    Content = intent.getStringExtra("Content");
    setTitle(Title);
    //if(getIntent().getData().getQueryParameter("author") != null)
    TabSpec descritor;

    /************************** Tab General **************************/
    descritor = getTabHost().newTabSpec("tag1");
    descritor.setContent(R.id.General);

    Button myButton = new Button(ShowAllegationActivity.this);
    myButton.setText("test");
    LinearLayout myContainer = (LinearLayout) findViewById(R.id.General);
    myContainer.addView(myButton);

    descritor.setIndicator("General", getResources().getDrawable(R.drawable.icon));
    getTabHost().addTab(descritor);

    /************************** Tab 2 **************************/
    descritor = getTabHost().newTabSpec("tag2");
    descritor.setContent(R.id.Recipe);
    Teste = (TextView) findViewById(R.id.teste2);
    Teste.setText("Teste2");
    descritor.setIndicator("Tab2", getResources().getDrawable(R.drawable.icon));
    getTabHost().addTab(descritor);

    /************************** Tab3 3 **************************/
    descritor = getTabHost().newTabSpec("tag3");
    descritor.setContent(R.id.Related);
    Teste = (TextView) findViewById(R.id.teste3);
    Teste.setText("Teste3");
    descritor.setIndicator("Tab3", getResources().getDrawable(R.drawable.icon));
    getTabHost().addTab(descritor);

    getTabHost().setCurrentTab(0);

}

}

xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TabHost android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical">
        <TabWidget android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:id="@android:id/tabs"></TabWidget>
        <FrameLayout android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:id="@android:id/tabcontent">
            <LinearLayout android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:id="@+id/General">
                    <TextView android:layout_width="fill_parent"
                    android:layout_height="wrap_content" 
                    android:id="@+id/teste" />
                    <LinearLayout android:layout_width="fill_parent" 
                    android:layout_height="fill_parent" 
                    android:id="@+id/General2">
                    </LinearLayout>
            </LinearLayout>
            <LinearLayout android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:id="@+id/Recipe">
                    <TextView android:layout_width="fill_parent"
                    android:layout_height="wrap_content" 
                    android:id="@+id/teste2" />
            </LinearLayout>
            <LinearLayout android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:id="@+id/Related">
                    <TextView android:layout_width="fill_parent"
                    android:layout_height="wrap_content" 
                    android:id="@+id/teste3" />
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>
</TabHost>

5 个答案:

答案 0 :(得分:4)

您可以在代码中创建一个按钮:

Button myButton = new Button();
myButton.setLayoutParams(myLayoutParams);
myButton.setText(myText);

要使其显示Toast,请添加onClickListener:

myButton.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View view)
                    {
                        //The parameter view is the button that was clicked 
                        Toast.makeText(context, ((Button) view).getText(), Toast.LENGTH_LONG).show()
                        //TypeCasting to Button is important, because a normal View doesn't have a getText method
                    }
                });

然后,要将它们添加到屏幕上,您需要在xml中定义一个容器来容纳它们,例如LinearLayout。获取LinearLayout:

LinearLayout myContainer = findViewById(R.id.myButtonId); //Make sure you set the android:id attribute in xml

您可能希望此代码在循环之外,也许就在它之前,因此您不会在每次迭代时获得布局。

然后,在循环中,设置按钮后:

myContainer.addView(myButton);

最后,关于myLayoutParams变量的说明。为视图设置参数时,它们需要与窗口小部件的父视图相对应。因此,如果您将Button放在LinearLayout中,它看起来像

//This will make LayoutParameters with layout_width="wrap_content" and layout_height="fill_parent"
LinearLayout.LayoutParams myLayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT, 
    LinearLayout.LayoutParams.FILL_PARENT);

您也可以将它放在循环之外,并为每个Button重复使用它。

答案 1 :(得分:2)

你能做的就是这样:

    Button button = new Button(this);
    ViewGroup viewGroup = (ViewGroup) findViewById(R.id.container);

    viewGroup.addView(button);

我不知道你的布局,所以我不能更具体。

ViewGroup将是你的布局,它应该有findByViewId找到的id。

此外,你必须放置你想要的按钮。

答案 2 :(得分:1)

 while (Content.indexOf("<glossary>") != -1) {
    Content = Content.substring(Content.indexOf("<glossary>") + 9);
    //create button with name "Content"
    Button b = new Button(this);
    b.setText(Content);
    // add this new view to your parent layout
    parent.addView(b);

}

答案 3 :(得分:1)

您需要在XML中包含一个布局来保存您添加的按钮(您可以动态地执行此操作,但似乎没有必要)。如果要添加按钮,请找到该布局。然后,您可以使用ViewGroup.addView(View child)将按钮添加到视图层次结构中。

您还需要告诉系统布局已更改,您可以使用View.invalidate()方法执行此操作。

答案 4 :(得分:1)

我改变了创建标签的方式,但它确实有效!