2017-06-12 3 views
2

クリックすると、私はそうのようなボタンクリック観測を追加したい: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回のクリックを私のダイアログを作成して、ボタンにサブスクライブこのように私の活動:button1は、サブスクリプションの時点でnullであるよう

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    BasicDialog basicDialog = new BasicDialog(this); 

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

これは、nullポインタ例外が発生します。

これは可能な修正を知っていますが、ボタンをクリックしてobservableに直接購読するのではなく、ダイアログ内でPublishSubjectを使用することになりますが、これは非常に面白い解決策のようです。

ご協力いただきありがとうございます。

答えて

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()); 
    } 
 
+0

ありがとう、私は作成方法について知りませんでした!しかし、それはapi 21上でのみサポートされており、私は17以上をサポートする必要があります。 apiレベル21の下でこれを行う方法があるかどうか知っていますか? – DCoutts

+0

別のアプローチを取ってBasicDialog内のクリックを処理することができますので、DialogのonCreate() – Tuby

+0

@DCouttsにサブスクライブします。下位のAPIでは 'basicDialog.show()'を実行し、その後は 'basicDialog.button1Clicks() '。 – azizbekian

関連する問題