NPE при подписке на нажатие кнопки диалога

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

public class BasicDialog extends android.app.Dialog {

    @BindView(R.id.button1)
    TextView button1;
    @BindView(R.id.button2)
    TextView button2;

    public BasicDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_basic);

        ...

        ButterKnife.bind(this);
    }

    public Observable<Object> button1Clicks() {
        return RxView.clicks(button1);
    }

    public Observable<Object> button2Clicks() {
        return RxView.clicks(button2);
    }
}

Затем я создаю свой диалог и подписываюсь на нажатие кнопки 1 в моем действии следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...

    BasicDialog basicDialog = new BasicDialog(this);

    basicDialog.button1Clicks()
            .subscribe(__ -> doStuff());
}

Это приводит к исключению нулевого указателя, поскольку button1 имеет значение NULL в точке подписки.

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

Спасибо заранее за любые предложения!


person DCoutts    schedule 12.06.2017    source источник


Ответы (1)


Проблема в том, что вы подписываетесь на нажатие кнопки слишком рано.


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...

        BasicDialog basicDialog = new BasicDialog(this);
        // `basicDialog` hasn't yet been created, it has no view hierarchy inflated yet

        // Force create the dialog
        basicDialog.create();

        // Now you have your dialog created
        basicDialog.button1Clicks()
                .subscribe(__ -> doStuff());
    }

person azizbekian    schedule 12.06.2017
comment
Спасибо, я не знал о методе создания! Однако он поддерживается только на api 21 и выше, а мне нужно поддерживать 17 вверх. Вы знаете, есть ли способ сделать это ниже уровня API 21? - person DCoutts; 12.06.2017
comment
Вы можете использовать другой подход, обрабатывать щелчки внутри BasicDialog, поэтому вы подпишетесь в Dialog onCreate () - person Tuby; 12.06.2017
comment
@DCoutts, для API ниже 21 необходимо выполнить basicDialog.show(), а после этого выполнить basicDialog.button1Clicks(). - person azizbekian; 12.06.2017