Android вызывает пользовательский класс alerttdialog - PullRequest
0 голосов
/ 10 октября 2018

Вот мой пользовательский класс dialogalertdialog.Я хочу создать собственный диалог, и я вызываю каждое действие, но у меня есть некоторые ошибки.Я не мог это исправить.Я не знаю, как я могу это исправить.

public class AlertForSelection extends AlertDialog {
private Context context;
private List<UpperCategory> lstUpper;
private int id;
private LinearLayout lnrList;
private String name;

public AlertForSelection(Context context, List<UpperCategory> lstUpper) {
    super(context);
    this.context = context;
    this.lstUpper = lstUpper;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.alert_for_selection_view);
    this.lnrList = (LinearLayout) findViewById(R.id.lnrList);
    this.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  }
}

здесь я звонил с нажатием кнопки.

final AlertForSelection alertForSelection = new
AlertForSelection(getApplicationContext(), listUpperCategory);
alertForSelection.show();

это ошибка

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
                                                                              at android.view.ViewRootImpl.setView(ViewRootImpl.java:769)
                                                                              at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
                                                                              at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
                                                                              at android.app.Dialog.show(Dialog.java:330)
                                                                              at com.example.samcro.petshop.Activities.NewActivity.BtnUpCategory_Click(NewActivity.java:80)
                                                                              at com.example.samcro.petshop.Activities.NewActivity.access$000(NewActivity.java:24)
                                                                              at com.example.samcro.petshop.Activities.NewActivity$1.onClick(NewActivity.java:56)
                                                                              at android.view.View.performClick(View.java:6294)
                                                                              at android.view.View$PerformClick.run(View.java:24774)
                                                                              at android.os.Handler.handleCallback(Handler.java:790)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                              at android.os.Looper.loop(Looper.java:164)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6518)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

вы не можете использовать «getApplicationContext ()» для создания нового AlertDialog, вы должны прикрепить контекст действия к новому AlertDialog, потому что

    Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
    // something not important
    mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);

    final Window w = new PhoneWindow(mContext);
    mWindow = w;
    w.setCallback(this);
    w.setOnWindowDismissedCallback(this);
    w.setWindowManager(mWindowManager, null, null);
    w.setGravity(Gravity.CENTER);

    mListenersHandler = new ListenersHandler(this);
  }

здесь новая функция Dialog () будет использоватьконтекст для нового mWindowManager, когда вы используете show ()

 public void show() {
    // something not important
    mDecor = mWindow.getDecorView();

    WindowManager.LayoutParams l = mWindow.getAttributes();
    if ((l.softInputMode
            & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
        WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
        nl.copyFrom(l);
        nl.softInputMode |=
                WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
        l = nl;
    }

    try {
        mWindowManager.addView(mDecor, l);
        mShowing = true;

        sendShowMessage();
    } finally {
    }
}

, здесь mWindowManager требует addView, но если контекст является applicationContext, токен mWindowManager будет нулевым.если контекст является активностью, активность свяжет свой токен с mWindowManager, он может работать хорошо.

0 голосов
/ 10 октября 2018

Если вы используете getApplicationContext () в качестве контекста для диалогового окна, подобного этому

AlertForSelection alertForSelection = new AlertForSelection(getApplicationContext(), listUpperCategory);

, тогда используйте YourActivityName.this

AlertForSelection alertForSelection = new AlertForSelection(YourActivityName.this, listUpperCategory);
...