1

我有非活動類MenuHandler來處理與菜單有關的事件, 我試圖在提示對話框中顯示開發人員消息,此消息從firebase實時數據庫中獲取。沒有錯誤,但提示對話框不顯示

一切都很好,但不顯示警告對話框中,我嘗試調試檢查有數據庫的任何錯誤,但我從數據庫得到的值正常。沒有錯誤從數據庫中獲取價值。

當我從MainActivity選擇菜單時,developerMessage吐司顯示什麼都沒有發生。

我正確地傳遞給contextMenuHandler。 我可以在使用上下文中顯示Alerdialog嗎? 或我只需要在MainActivity(即僅活動類別)中編寫代碼。

代碼:

public void developersMessage() 
    { 

     if (isInternetOn()) { 

      Toast.makeText(mContext,"Loading message please wait",Toast.LENGTH_SHORT).show(); 

      DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 

      mDatabase.child("version_1_0").child("dev").addListenerForSingleValueEvent(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

         try { 

          final AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 
          builder.setTitle(mContext.getString(R.string.welcome_msg)); 
          builder.setMessage(dataSnapshot.child("dev_msg").getValue(String.class)); 
          builder.setPositiveButton("ok",null); 

          builder.create().show(); 
         } 
         catch (Exception e) 
         { 
          e.printStackTrace(); 
         } 
        } 


       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

     } 
     else 
     { 
      Toast.makeText(mContext,"please turn on internet ",Toast.LENGTH_SHORT).show(); 
     } 
    } 
+0

嘗試在代替builder.create的'創建AlertDialog'的'一個實例()表示();'這樣的: 'AlertDialog對話框= builder.create();'' dialog.show(); ' –

+0

沒有任何改變。結果是相同 –

+0

at'try ... catch;'level是否能夠獲得調試日誌或敬酒?因爲如果你是那麼問題在於警報對話框,如果你不能然後將你的調試級別移動到「偵聽器」等... –

回答

0

我得到了答案, 沒有什麼不好的代碼,但缺陷在於如何我從主要活動發送上下文

這裏我錯誤地init初始Menuhandler類

public boolean onOptionsItemSelected(MenuItem item) { 

final MenuHandler mMenuHandler = new MenuHandler(this.getApplicationContext());//bug lies here 

如果我們展示alertdialog那麼我們就需要這種方式來傳遞上下文所以我們alertdialog正常顯示

public boolean onOptionsItemSelected(MenuItem item) { 
     final MenuHandler mMenuHandler = new MenuHandler(MainActivity.this);//this is right way to pass context 

希望這有助於有人在未來。

0

建立你的AlertDialog出

mDatabase.child("version_1_0").child("dev").addListenerForSingleValueEvent(...); 

addListenerForSingleValueEvent(...)方法在不同的背景線程中運行,因此UI不能關閉UI線程內更新。因此,從addListenerForSingleValueEvent(...)方法中構建您的AlertDailog應該可以解決您的問題。

0

您應該使用活動上下文來創建AlertDialog。

並請調試,以確保onDataChange()被稱爲

還與runOnUiThread嘗試:https://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

yourActivity.runOnUiThread(new Runnable() { public void run() {... code to create & show dialog ...} })

+0

onDatachange正在工作。我的MainActivity和MenuHandeler類不同, –

+0

所以嘗試將活動引用傳遞給MenuHandler。用它來runOnUiThread並創建對話框 – Akivamu