1

메뉴 관련 이벤트를 처리하기 위해 비 활동 등급 MenuHandler이 있습니다.이 메시지는 firebase 실시간 데이터베이스에서 가져 오기 대화 상자에 개발자 메시지를 표시하려고합니다.오류는 없지만 경고 대화 상자가 나타나지 않습니다.

모든 것이 정상이지만 경고 대화 상자가 표시되지 않습니다. 데이터베이스의 오류를 검사하기 위해 디버거를 시도하지만 데이터베이스에서 올바르게 값을 얻었습니다. 데이터베이스에서 값을 가져 오는 데 오류가 없습니다.

MainActivity에서 메뉴를 선택하면 developerMessage 축배는 아무 일도 일어나지 않습니다.

context ~ MenuHandler 클래스를 올바르게 전달합니다. 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

변경된 사항이 없습니다. 결과는 디버그 로그 나 토스트를 얻을 수있는 'try ... catch;'수준에서 –

+0

과 동일합니까? 왜냐하면 만약 당신이 그때 문제는 경고 대화와 거짓말, 그때 당신은 디버거 레벨 등 '청취자까지 등을 움직일 수 없다 ... –

답변

0

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

방법에있다 I mainactivity에서 컨텍스트를 보냅니다.

여기 잘못 입력했습니다. 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

addListenerForSingleValueEvent(...) 방법은 다른 배경 스레드에서 실행되므로 UI는 UI 스레드 떨어져 내 업데이트 할 수 없습니다

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

에서 당신에 AlertDialog를 구축 할 수 있습니다. 따라서 addListenerForSingleValueEvent(...) 메소드에서 AlertDailog를 빌드하면 문제가 해결됩니다.

0

AlertDialog를 만들려면 활동 컨텍스트를 사용해야합니다.

있는지 onDataChange()를 만들기 위해 디버깅하시기 바랍니다는 또한 runOnUiThread로 시도

라고 : 나는 대답, 코드 만 버그 잘못 이 아무것도 가지고 yourActivity.runOnUiThread(new Runnable() { public void run() {... code to create & show dialog ...} })

+0

onDatachange도 작동합니다. 내 MainActivity 클래스와 MenuHandeler 클래스가 다릅니다. –

+0

그래서 MenuHandler에 대한 활동 참조를 전달하십시오. 그것을 사용하여 OnUnThread를 실행하고 대화 상자를 만듭니다. – Akivamu

관련 문제