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

1
Shuky Chen 27 wrzesień 2012, 15:54

2 odpowiedzi

Najlepsza odpowiedź

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;
    }
  }
1
knvarma 27 wrzesień 2012, 23:52

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" />
1
Konrad G 21 styczeń 2014, 21:09