在Android中通过点击按钮动态添加微调器

在Android中通过点击按钮动态添加微调器,android,dynamic,android-spinner,Android,Dynamic,Android Spinner,我尝试使用以下代码将微调器动态添加到我的应用程序中: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startTime = (EditText)findViewById(R.id.EditTextST); startDate

我尝试使用以下代码将微调器动态添加到我的应用程序中:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startTime = (EditText)findViewById(R.id.EditTextST);  
    startDate = (EditText)findViewById(R.id.editTextSD); 

    LinearLayout linearlayout = new LinearLayout(this);
    //RelativeLayout linearlayout = (RelativeLayout)findViewById(R.id.main_layout);

    ArrayList<String> spinnerArray = new ArrayList<String>();
    spinnerArray.add("one");
    spinnerArray.add("two");
    spinnerArray.add("three");
    spinnerArray.add("four");
    spinnerArray.add("five");

    Spinner spinner = new Spinner(this);
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item, spinnerArray);
    spinner.setAdapter(spinnerArrayAdapter);

    linearlayout.addView(spinner);

    setContentView(linearlayout);
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startTime=(EditText)findViewById(R.id.EditTextST);
startDate=(EditText)findViewById(R.id.editTextSD);
LinearLayout LinearLayout=新的LinearLayout(本);
//RelativeLayout linearlayout=(RelativeLayout)findViewById(R.id.main\U布局);
ArrayList SpinneArray=新的ArrayList();
添加(“一”);
添加(“两个”);
添加(“三”);
添加(“四”);
加上(“五”);
微调器微调器=新微调器(此);
ArrayAdapter SpinnerayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u spinner\u dropdown\u项目,Spinnerary);
spinner.setAdapter(SpinNearrayaAdapter);
linearlayout.addView(微调器);
setContentView(线性布局);
}
这会添加微调器,但会用动态创建的微调器替换XML中的所有内容。 我想通过单击按钮,而不是替换布局,将微调器添加到布局(我使用XML创建了该布局)。请帮忙

编辑:这是我的XML文件

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<RelativeLayout
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="900dp" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/select_week"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:text="@string/sun" />

    <CheckBox
        android:id="@+id/checkBox2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/checkBox1"
        android:layout_alignBottom="@+id/checkBox1"
        android:layout_toRightOf="@+id/checkBox1"
        android:text="@string/mon" />

    <CheckBox
        android:id="@+id/checkBox3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/checkBox2"
        android:layout_toRightOf="@+id/checkBox2"
        android:text="@string/tue" />

    <CheckBox
        android:id="@+id/checkBox4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/checkBox3"
        android:layout_alignBottom="@+id/checkBox3"
        android:layout_toRightOf="@+id/checkBox3"
        android:text="@string/wed" />

    <CheckBox
        android:id="@+id/checkBox5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/checkBox1"
        android:layout_toLeftOf="@+id/checkBox2"
        android:text="@string/thu" />

    <CheckBox
        android:id="@+id/checkBox6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/checkBox2"
        android:layout_below="@+id/checkBox2"
        android:text="@string/fri" />

    <CheckBox
        android:id="@+id/checkBox7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/checkBox2"
        android:layout_toRightOf="@+id/checkBox2"
        android:text="@string/sat" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/checkBox5"
        android:layout_marginTop="18dp"
        android:text="@string/select_week_number"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <CheckBox
        android:id="@+id/CheckBox01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/checkBox02"
        android:layout_alignBottom="@+id/checkBox02"
        android:layout_alignLeft="@+id/checkBox5"
        android:text="@string/one" />

    <CheckBox
        android:id="@+id/CheckBox03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/checkBox02"
        android:layout_alignBottom="@+id/checkBox02"
        android:layout_toRightOf="@+id/checkBox6"
        android:text="@string/three" />

    <CheckBox
        android:id="@+id/checkBox02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:layout_toRightOf="@+id/checkBox5"
        android:text="@string/two" />

    <CheckBox
        android:id="@+id/CheckBox04"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/CheckBox03"
        android:layout_alignBottom="@+id/CheckBox03"
        android:layout_toRightOf="@+id/textView2"
        android:text="@string/four" />

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/CheckBox01"
        android:layout_marginTop="16dp"
        android:text="@string/select_start_date"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/editTextSD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/CheckBox01"
        android:layout_below="@+id/TextView01"
        android:layout_toLeftOf="@+id/CheckBox04"
        android:ems="10"
        android:inputType="text|date"
        android:onClick="showDatePickerDialog" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/EditTextST"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editTextSD"
        android:layout_alignBottom="@+id/editTextSD"
        android:layout_alignLeft="@+id/CheckBox04"
        android:ems="10"
        android:inputType="time"
        android:onClick="showTimePickerDialog" />

    <TextView
        android:id="@+id/TextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editTextSD"
        android:layout_below="@+id/editTextSD"
        android:layout_marginTop="17dp"
        android:text="@string/select_end_date"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/EditText01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/TextView02"
        android:layout_alignRight="@+id/editTextSD"
        android:layout_below="@+id/TextView02"
        android:ems="10"
        android:inputType="text|date"
        android:onClick="showDatePickerDialog" />

    <EditText
        android:id="@+id/EditText02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/EditText01"
        android:layout_alignBottom="@+id/EditText01"
        android:layout_alignLeft="@+id/EditTextST"
        android:ems="10"
        android:inputType="time"
        android:onClick="showTimePickerDialog" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/EditText01"
        android:layout_below="@+id/EditText01"
        android:layout_marginTop="17dp"
        android:text="@string/reminder"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView3"
        android:entries="@array/reminder_times"
        android:paddingLeft="-10dp"
        android:gravity="left"
        tools:listitem="@android:layout/activity_list_item" />

    <Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_below="@+id/spinner1"
        android:layout_marginTop="119dp"
        android:text="@string/add_reminder" />



</RelativeLayout>

</ScrollView>

请查看您的代码

setContentView(R.layout.activity_main);
但后来

setContentView(linearlayout);
这些事情都要小心处理

请在您的主xml布局中使用单独的线性布局,并使用以下内容

 final LinearLayout lm = (LinearLayout) findViewById(R.id.linearMain);
而不是
LinearLayout LinearLayout=新的LinearLayout(此)

错误:您创建了新的线性布局(不包含任何视图)并向其中添加了微调器,然后使用此仅包含微调器的布局重新绘制活动主布局

简单的方法是使微调器最初不可见,并在单击按钮时使其可见

因此,在XML中声明微调器spinner visibility=“gone”

现在,单击按钮即可使微调器可见

timer_spin.setVisibility(View.VISIBLE); 
注意

消失了:此视图不可见,并且不占用任何空间用于布局

不可见:此视图不可见,但仍会占用布局空间


可见:此视图可见。

这就是您所做的

  • 添加了新的线性布局
  • 在上述布局中添加了微调器
  • 然后设置内容视图
  • 我认为这是可行的。

  • 您可以使用
    findviewbyd(R.id.root\u布局)
    获得根布局
  • 现在创建一个微调器。按照上面代码中正确的操作向其添加项目
  • 现在将微调器添加到
    根目录布局中
  • 你的错误

    您创建了一个新布局并将其设置为主要内容,但从未将其添加到根目录布局

    调试

    如果要查看布局的布局层次结构,请打开ddms视图,然后单击此处的“Heriarchy查看器”选项。它位于“摄影机”选项附近。单击它并进入屏幕,您将看到布局层次结构,其中将显示包含微调器的线性布局

    这里有一个代码来演示它

    package com.example.testproject;
    
    导入android.app.Activity; 导入android.os.Bundle; 导入android.widget.ArrayAdapter; 导入android.widget.LinearLayout; 导入android.widget.RelativeLayout; 导入android.widget.Spinner

    公共类MainActivity扩展了活动{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * This is what you have done!!!
         */
        LinearLayout layout=new LinearLayout(this);
        String[] strings={"1","2","3"};
        Spinner spinner=new Spinner(this);
        spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,strings));
    
        layout.addView(spinner);
        /**
         * Comment this line when you use the below mentioned solution.
         */
        setContentView(layout);
    
        /**
         * This is what you should have done.
         */
    
         RelativeLayout root_layout=(RelativeLayout)findViewById(R.id.root_layout);
         root_layout.addView(spinner);
    
    }
    
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    /**
    *这就是你所做的!!!
    */
    LinearLayout布局=新的LinearLayout(本);
    字符串[]字符串={“1”、“2”、“3”};
    微调器微调器=新微调器(此);
    setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_spinner_dropdown_item,strings));
    layout.addView(微调器);
    /**
    *当您使用下面提到的解决方案时,请对此行进行注释。
    */
    setContentView(布局);
    /**
    *这是你应该做的。
    */
    RelativeLayout root\u布局=(RelativeLayout)findViewById(R.id.root\u布局);
    root_layout.addView(微调器);
    }
    
    }


    希望对您有所帮助。

    您能将您的
    活动\u main.xml
    文件发布在项目的
    res/layout/
    文件夹中吗

    在任何情况下,都应该将微调器添加到主布局中,而不是添加到未连接到任何内容的新线性布局中

    下面是解决方案的样子 (尽管如此,这仅取决于
    activity\u main.xml
    文件中实际写入的内容):

    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startTime=(EditText)findViewById(R.id.EditTextST);
    startDate=(EditText)findViewById(R.id.editTextSD);
    //下一行假设布局为main_布局
    //可以在res/layout/activity_main.xml中找到线性布局
    LinearLayout main布局=(LinearLayout)findViewById(R.id.main\U布局);
    ArrayList SpinneArray=新的ArrayList();
    添加(“一”);
    添加(“两个”);
    添加(“三”);
    添加(“四”);
    加上(“五”);
    微调器微调器=新微调器(此);
    ArrayAdapter SpinnerayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u spinner\u dropdown\u项目,Spinnerary);
    spinner.setAdapter(SpinNearrayaAdapter);
    mainLayout.addView(微调器);
    }
    
    在你纠正这个错误之后,我建议你学习一点Java,在三四个星期内每天至少做二十分钟的Java练习。一旦你对Java有了更多的了解,y
    package com.example.testproject;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * This is what you have done!!!
         */
        LinearLayout layout=new LinearLayout(this);
        String[] strings={"1","2","3"};
        Spinner spinner=new Spinner(this);
        spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,strings));
    
        layout.addView(spinner);
        /**
         * Comment this line when you use the below mentioned solution.
         */
        setContentView(layout);
    
        /**
         * This is what you should have done.
         */
    
         RelativeLayout root_layout=(RelativeLayout)findViewById(R.id.root_layout);
         root_layout.addView(spinner);
    
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        startTime = (EditText)findViewById(R.id.EditTextST);  
        startDate = (EditText)findViewById(R.id.editTextSD); 
    
        // The line below assumes that the layout called main_layout 
        // found in the res/layout/activity_main.xml is a LinearLayout
        LinearLayout mainLayout = (LinearLayout)findViewById(R.id.main_layout);
    
        ArrayList<String> spinnerArray = new ArrayList<String>();
        spinnerArray.add("one");
        spinnerArray.add("two");
        spinnerArray.add("three");
        spinnerArray.add("four");
        spinnerArray.add("five");
    
        Spinner spinner = new Spinner(this);
        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item, spinnerArray);
        spinner.setAdapter(spinnerArrayAdapter);
    
        mainLayout.addView(spinner);
    }