2017-06-12 37 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次點擊在我的活動是這樣的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    BasicDialog basicDialog = new BasicDialog(this); 

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

這導致空指針異常,如button1是在訂閱的點空。

我知道一個可能的解決辦法是在對話框中使用PublishSubject,而不是試圖直接訂閱按鈕click observable,但這看起來像是一個非常不雅的解決方案。

在此先感謝您的任何建議!

回答

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 level 21以下做到這一點? – DCoutts

+0

您可以採取另一種方法,處理BasicDialog中的點擊,因此您將在Dialog的onCreate() – Tuby

+0

@DCoutts中訂閱,對於低於21的API,您必須執行'basicDialog.show()',之後執行'basicDialog.button1Clicks() '。 – azizbekian

相關問題