Rozejrzałem się po całym Internecie i doskonale zdaję sobie sprawę z wątków w stackOverflow na ten temat, ale żaden z nich mi nie pomógł.
W mojej aplikacji używam biblioteki Standout open source, aby włączyć okna nie pełnoekranowe, w zasadzie to, co robi, to tworzenie układu ramki i pokazywanie go za pomocą
WindowManager.addView(View view, LayoutParams params)
Wewnątrz FrameLayout mam widok Spinner, aby pokazać rozwijaną listę. kiedy uruchamiam aplikację, wszystko działa dobrze, widzę układ FrameLayout i spinner, ale kiedy dotykam spinnera, aplikacja ulega awarii z błędem: „Nie można dodać okna – token null nie jest dla aplikacji”
Nie mam żadnego wiersza kodu za pomocą getApplicationContext(), chociaż biblioteka Standout miała, zmieniłem je tak, aby wskazywały „to” i nadal się zawiesza.
Czy ktoś może mi pomóc?
EDYTUJ: dzieje się to tylko na urządzeniach 2.3.5 (z tego, co sprawdziłem), działa dobrze na 4.1
2 odpowiedzi
Dzieje się tak, ponieważ okno Wyróżnienie nie jest działaniem. To tylko typ AlertWindow. Kliknięcie Spinner spowoduje próbę wyświetlenia okna dialogowego, które zakłada, że zostało uruchomione z aktywności. Ale to nie jest. Następnie następuje awaria aplikacji. Aby rozwiązać ten problem, musisz rozszerzyć Spinner, aby wyświetlał okno dialogowe widoku listy, tak jak pokazuje spinner, gdy użytkownik kliknie Spinner. Wypróbuj poniższy kod, aby wyświetlić okno dialogowe z klasy nieaktywnej:
public class MySpinner extends Spinner {
@Override
public boolean performClick() {
// the spinner click is handled here
selectedPosition = getSelectedItemPosition();
Dialog dialog = getDialog();
Window window = dialog.getWindow();
window.getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
dialog.show();
}
return true;
}
private Dialog getDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View dialogView = inflate(getContext(),R.layout.spin_dialog, null);
builder.setView(dialogView);
// show the Spinner array list in a listview
ListView listview = (ListView) dialog.findViewById(R.id.spin_list);
listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listview.setOnItemClickListener(this);
ArrayAdapter adapter = new ArrayAdapter(getContext(), R.layout.list_item, spinner_array_list);
// here is your spin adapter
listview.setAdapter(adapter);
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
AlertDialog dialog = catBuilder.create();
return dialog;
}
}
Miałem ten sam problem. Rozwiązanie jest dość proste. Wystarczy dodać w swoim układzie plik XML:
android:spinnerMode="dropdown"
Więc twój element spinnera będzie wyglądał mniej więcej tak:
<Spinner
android:id="@+id/spLists"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:spinnerMode="dropdown" />
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.