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>
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. –