2016-03-23 21 views
0

Bir AppCompatSpinner'ı bir diyaloğa yerleştirdim. SetSelection() ile seçimin seçimi ilk kez çalışır, ancak diyalog tekrar gösterildiğinde setSelection() çalışmaz. Niye ya?AppCompatSpinner.setSelection ikinci kez çalışmaz

Örneğin, aşağıdaki örnekte, önce Homer düğmesine bastığımda, spiker Homer'i gösterir, ancak Marge düğmesine bastığımda, "Marge ayarı" hata ayıklama mesajını görsem de, spiner hala Homer'i gösterir. .

Önce Marge tuşuna bastığımda, daha sonra Homer'a bassam da sıkma Marge'ı her zaman gösterir.

MainActivity.java

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends AppCompatActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button homer = (Button)findViewById(R.id.homer); 
     homer.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Bundle args = new Bundle(); 
       args.putString("name", "homer"); 
       MyDialogue dlg = MyDialogue.getInstance(args); 
       dlg.show(getSupportFragmentManager(), dlg.getClass().getName()); 
      } 
     }); 

     Button marge = (Button)findViewById(R.id.marge); 
     marge.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Bundle args = new Bundle(); 
       args.putString("name", "marge"); 
       MyDialogue dlg = MyDialogue.getInstance(args); 
       dlg.show(getSupportFragmentManager(), dlg.getClass().getName()); 
      } 
     }); 
    } 
} 

MyDialogue.java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatDialogFragment; 
import android.support.v7.widget.AppCompatSpinner; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MyDialogue extends AppCompatDialogFragment 
{ 
    static MyDialogue instance; 

    public static MyDialogue getInstance(Bundle args) 
    { 
     if(instance == null) 
      instance = new MyDialogue(); 
     instance.setArguments(args); 
     return instance; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View v = inflater.inflate(R.layout.dialogue, container, false); 
     AppCompatSpinner family = (AppCompatSpinner) v.findViewById(R.id.family); 

     Bundle args = getArguments(); 
     final String name = args.getString("name"); 

     if(name.equals("homer")) 
     { 
      Log.d("spin", "Setting to homer"); 
      family.setSelection(0); 
     } 
     else if(name.equals("marge")) 
     { 
      Log.d("spin", "Setting to marge"); 
      family.setSelection(1); 
     } 
     else 
     { 
      Log.d("spin", "Setting to bart"); 
      family.setSelection(2); 
     } 

     return v; 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    > 

    <Button 
     android:text="Homer" 
     android:id="@+id/homer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <Button 
     android:text="Marge" 
     android:id="@+id/marge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

dialogue.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <android.support.v7.widget.AppCompatSpinner 
     android:entries="@array/list_items" 
     android:id="@+id/family" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    </android.support.v7.widget.AppCompatSpinner> 

</LinearLayout> 

strings.xml

<resources> 
    <string name="app_name">Test2</string> 
    <string-array name="list_items"> 
     <item>Homer</item> 
     <item>Marge</item> 
     <item>Bart</item> 
    </string-array> 
</resources> 

cevap

0
böyle onResume için setSelection çağrısı Taşı

: Ben setSelection birlikte çalıştığım zaman

@Override 
public void onResume() { 
    super.onResume(); 
    Bundle args = getArguments(); 
    final String name = args.getString("name", ""); 

    if (name.equals("homer")) { 
    Log.d("spin", "Setting to homer"); 
    family.setSelection(0); 
    } else if (name.equals("marge")) { 
    Log.d("spin", "Setting to marge"); 
    family.setSelection(1); 
    } else { 
    Log.d("spin", "Setting to bart"); 
    family.setSelection(2); 
    } 
} 

her zaman flakey olmuştur. Tahminim, adaptör oluşturmak yerine android:entries ayarlandığından, adaptörün setSelection çağrılarınızdan sonra sıfırlanmasının nedeni olabilir, bu da 0 konumuna sıfırlanmasına neden olabilir (Homer bu durumda). Seçimin onResume'a taşınması, tüm başlatma işlemlerinin tamamlanmasını bekleyerek bu sorunu giderecektir.

+0

Kodu onCreateView'dan onResume'ye taşıdım ve şimdi sorun giderildi. Bu garip çünkü TextView'un metinleri gibi diğer şeylerin ayarlanması onCreateView üzerinde çalıştı. Bu arada, her zaman 0'a sıfırlanmadı, sadece ilk önce ayarlanmış olan dizini tuttu. Örneğin, önce Marge'ı (konum 1) ayarladıysam, Marge'ı göstermeye devam etti. Bağdaştırıcıları, girdilerden daha el ile oluşturmak daha iyi bir uygulama mı? Sadece girişler kullandım çünkü uluslararası kodlamada öğeler için kodlanmış dizeleri kullanmak istemedim. –