2010-12-28 1 views
5

以下は、Androidアプリケーションで発生しているバグへのリンクです。巨大なテキストの壁を使って説明しようとするのではなく、単純なビデオがはるかに直接的かつ理解しやすくなると思った。2.2の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

、影響を受けたSpinnerinvalidate()を呼び出してみてください。ここでは

コードがあります。まず、setSelection()に電話してみてください。それが失敗した場合は、SpinnerpostDelayed()を使用して少し遅れてinvalidate()(50msなど)を呼び出してみてください。

さらに、この動作を示す2つのアクティビティ(または2つのレイアウトのアクティビティ)を持つデモンストレーションプロジェクトを作成し、http://b.android.comに投稿することをおすすめします。

+0

私は両方を試してみましたが、残念ながら同じ結果で終了しました。あなたは私にその問題を救済する考えを与えました。ボトムスピナーを間違った値に設定し、postDelayed()を使用して適切な値に戻すことができます。それはかなりではありませんが、今のところトリックをしたようです。私はこの週末にバグレポートをまとめます。ご協力ありがとうございました! – user432209

関連する問題