Ошибка с Android Spinner в 2.2, связанная с расположением макета - PullRequest
5 голосов
/ 28 декабря 2010

Ниже приведена ссылка на ошибку, с которой я столкнулся в своем приложении для Android. Вместо того, чтобы пытаться объяснить это через огромную стену текста, я подумал, что простое видео будет гораздо более прямым и простым для понимания.

http://www.youtube.com/watch?v=9V3v854894g

Я уже полтора дня бьюсь головой об стену по этой проблеме. Я обнаружил, что это можно решить, изменив XML-макет совсем недавно, что для меня абсолютно бессмысленно. Я понятия не имею, как правильно это исправить или как исправить проблему, поскольку мне нужны вложенные макеты в моем приложении.

Спасибо всем за помощь!

Вот код:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;

public class Builder extends Activity {
    private Spinner mCompSelect;
    private Spinner mNameSelect;
    private int[] mCompColorAsBuilt;
    private int mComponent;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.builder);

        mCompColorAsBuilt = new int[3];

        //Attach our objects
        mCompSelect = (Spinner) findViewById(R.id.component);
        mNameSelect = (Spinner) findViewById(R.id.component_name);

        //Attach an adapter to the top spinner
        ArrayAdapter<CharSequence> a = ArrayAdapter.createFromResource(this, R.array.cc_components, android.R.layout.simple_spinner_item);
        a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mCompSelect.setAdapter(a);
        //Create a listener when the top spinner is clicked
        mCompSelect.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //Save the position
                mComponent = position;
                //Create a new adapter to attach to the bottom spinner based on the position of the top spinner
                int resourceId = Builder.this.getResources().getIdentifier("component"+Integer.toString(mComponent)+"_color", "array", Builder.this.getPackageName());      
                ArrayAdapter<CharSequence> a = ArrayAdapter.createFromResource(Builder.this, resourceId, android.R.layout.simple_spinner_item);
                a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                mNameSelect.setAdapter(a);
                //Set the position of the bottom spinner to the saved position
                mNameSelect.setSelection(mCompColorAsBuilt[mComponent]);
            }
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        //Attach an adapter to the bottom spinner
        int resourceId = this.getResources().getIdentifier("component"+Integer.toString(mComponent)+"_color", "array", this.getPackageName());      
        ArrayAdapter<CharSequence> b = ArrayAdapter.createFromResource(this, resourceId, android.R.layout.simple_spinner_item);
        b.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mNameSelect.setAdapter(b);
        mNameSelect.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {       
                //Save the position of the bottom spinner
                mCompColorAsBuilt[mComponent] = position;
            }
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
}

XML

<?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="fill_parent" >

    <Spinner
        android:id="@+id/component"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/finish"
        android:drawSelectorOnTop="true"
        android:prompt="@string/component_spinner" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <Spinner
            android:id="@+id/component_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawSelectorOnTop="true"
            android:prompt="@string/component_name_spinner" />
    </LinearLayout>
</RelativeLayout>

1 Ответ

1 голос
/ 28 декабря 2010

Как хак, попробуйте позвонить invalidate() на затронутую Spinner.Сначала попробуйте после звонка setSelection().Если это не помогло, попробуйте использовать postDelayed() на Spinner для вызова invalidate() чуть позже (например, 50 мс).

Кроме того, я призываю вас создать демонстрационный проект с двумя действиями (иливозможно только одно действие с двумя макетами), которое иллюстрирует это поведение, и отправьте его и объяснение к http://b.android.com.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...