Добавление Spinner в LinearLayout программно - PullRequest
0 голосов
/ 11 февраля 2012

все! Я довольно новичок в мире Android, но я действительно искал ответ на эту проблему, прежде чем спрашивать об этом здесь ...

У меня есть горизонтальная LinearLayout в моем макете, названная "spinner". Первоначально (то есть в файле xml) там есть только один счетчик.

У меня также есть кнопка (id: addPath), которая активировала метод, и я хочу, чтобы этот метод (add_path) добавил еще один счетчик в представление (и после другого нажатия - еще один счетчик и т. Д.). Все дополнительные счетчики идентичны , т.е. основаны на одном и том же строковом массиве (path_array).

Вот так выглядит мой xml:

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

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/compWelcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"          
        android:text="@string/complicated_welcome" />

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/spinners"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textCompStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/complicated_prefix" />

        <Spinner
            android:id="@+id/spinner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:prompt="@string/spinner_prompt" />

        <TextView
            android:id="@+id/textCompEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/complicated_postfix" />
    </LinearLayout>

        <Button
            android:id="@+id/addPath"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="add_path"
            android:text="@string/add_path_button" />

</LinearLayout>
</ScrollView>

Вот так я активирую счетчик в onCreate:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.path_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

Теперь, как должен выглядеть метод add_path, как для создания счетчика, так и для фактического добавления его в LinearLayout ?

Спасибо, Арнон


Вот вывод LogCat после нажатия кнопки, вызывающей метод, в котором я добавил создание счетчика:

02-10 19:56:17.097: D/AndroidRuntime(284): Shutting down VM
02-10 19:56:17.097: W/dalvikvm(284): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
02-10 19:56:17.097: E/AndroidRuntime(284): Uncaught handler: thread main exiting due to uncaught exception
02-10 19:56:17.117: E/AndroidRuntime(284): java.lang.IllegalStateException: Could not execute method of the activity
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.View$1.onClick(View.java:2031)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.View.performClick(View.java:2364)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.View.onTouchEvent(View.java:4179)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.widget.TextView.onTouchEvent(TextView.java:6541)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.View.dispatchTouchEvent(View.java:3709)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
02-10 19:56:17.117: E/AndroidRuntime(284):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
02-10 19:56:17.117: E/AndroidRuntime(284):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
02-10 19:56:17.117: E/AndroidRuntime(284):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.os.Looper.loop(Looper.java:123)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.app.ActivityThread.main(ActivityThread.java:4363)
02-10 19:56:17.117: E/AndroidRuntime(284):  at java.lang.reflect.Method.invokeNative(Native Method)
02-10 19:56:17.117: E/AndroidRuntime(284):  at java.lang.reflect.Method.invoke(Method.java:521)
02-10 19:56:17.117: E/AndroidRuntime(284):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-10 19:56:17.117: E/AndroidRuntime(284):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-10 19:56:17.117: E/AndroidRuntime(284):  at dalvik.system.NativeStart.main(Native Method)
02-10 19:56:17.117: E/AndroidRuntime(284): Caused by: java.lang.reflect.InvocationTargetException
02-10 19:56:17.117: E/AndroidRuntime(284):  at arnon.cousinator.complicated.add_path(complicated.java:48)
02-10 19:56:17.117: E/AndroidRuntime(284):  at java.lang.reflect.Method.invokeNative(Native Method)
02-10 19:56:17.117: E/AndroidRuntime(284):  at java.lang.reflect.Method.invoke(Method.java:521)
02-10 19:56:17.117: E/AndroidRuntime(284):  at android.view.View$1.onClick(View.java:2026)
02-10 19:56:17.117: E/AndroidRuntime(284):  ... 23 more
02-10 19:56:17.117: E/AndroidRuntime(284): Caused by: java.lang.NullPointerException
02-10 19:56:17.117: E/AndroidRuntime(284):  ... 27 more
02-10 19:56:17.148: I/dalvikvm(284): threadid=7: reacting to signal 3
02-10 19:56:17.148: I/dalvikvm(284): Wrote stack trace to '/data/anr/traces.txt'
02-10 20:01:17.165: I/Process(284): Sending signal. PID: 284 SIG: 9
02-10 20:01:17.638: D/dalvikvm(290): GC freed 680 objects / 54464 bytes in 54ms
02-10 20:01:17.808: D/dalvikvm(290): GC freed 40 objects / 1472 bytes in 46ms

(кстати, я использую Eclipse)

Спасибо, Арнон

1 Ответ

1 голос
/ 11 февраля 2012

Вам нужно получить макет

View linearLayout =  findViewById(R.id.layoutID);

Вращающийся ящик

       Spinner spinner = new Spinner(this);
//Make sure you have valid layout parameters.
    spinner .setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

                    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,
                            android.R.layout.simple_spinner_dropdown_item, spinnerList);
                    spinner.setAdapter(spinnerArrayAdapter);

Затем добавьте счетчик для просмотра

((LinearLayout) linearLayout).addView(spinner );
...