2016-12-31 21 views
0

いつかメッセージが送信され、そのレポートがいつかBroadcastReceiverまで届くアプリがあります。このレポートは、以下に示すようにDialogFragmentを使用しているダイアログを介してユーザーに表示されます。コンテキストが変更されてもDialogFragmentを表示

myReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(firstTime) 
      firstTime = false; 

     boolean anyError = false; 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       anyError = true; 
       break; 
     } 

     sent.add(anyError); 
     CustomAlertDialogFragment customAlertDialogFragment = CustomAlertDialogFragment.newInstance("Title",logMessage); 
     customAlertDialogFragment.show(getActivity().getSupportFragmentManager(),"TAG"); 
     sent.clear(); 
    } 
}; 

CustomDialogのコードは以下のとおりです。

public class CustomAlertDialogFragment extends DialogFragment { 

    public static CustomAlertDialogFragment newInstance(String title, String content) { 
     CustomAlertDialogFragment customAlertDialogFragment = new CustomAlertDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putString("title",title); 
     args.putString("content", content); 
     customAlertDialogFragment.setArguments(args); 
     return customAlertDialogFragment; 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     String title = getArguments().getString("title"); 
     String content = getArguments().getString("content"); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     // title bar string 
     builder.setTitle(title); 
     builder.setPositiveButton(R.string.ok, null); 

     builder.setMessage(content); 
     AlertDialog errorDialog = builder.create(); 
     // return the Dialog object 
     return errorDialog; 
    } 
} 

ユーザーは、他のFragmentか一方Activityに移動した場合、ダイアログは表示されません。コンテキストが取得されない場合は、NullPointerExceptionが返されます。これに対する可能な選択肢または解決策は何か。私はメンバーが代わりに通知を使用するよう求めているが、私の要件はダイアログであるので、他のSOの質問を参照しました。助けてください。

答えて

0

Dialoguewindow leakedという例外が発生しています。あなたの場合、私はあなたがApplicationクラスを使用すると思うかもしれないと思う。

とにかく、あなたのApplicationクラスにBroadcastReceiverを登録すると、ブロードキャストを受信し、必要に応じてダイアログが表示されます。

Contextを検索するには、getApplicationContext()を使用してください。あなたが名前に

<application 
    android:name="Yourpackage.MyApplication" 
    android:allowBackup="false" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:logo="@drawable/your_logo" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" 
    tools:replace="android:icon"> 

    <!-- Your activities --> 
</application> 
を定義する必要がマニフェストで Applicationクラスを登録するには

public class MyApplication extends Application { 

    // Declare the BroadcastReceiver in your Application class 
    BroadcastReceiver myReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(firstTime) 
       firstTime = false; 

      boolean anyError = false; 
      switch (getResultCode()) { 
       case Activity.RESULT_OK: 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        anyError = true; 
        break; 
      } 

      sent.add(anyError); 
      CustomAlertDialogFragment customAlertDialogFragment = CustomAlertDialogFragment.newInstance("Title",logMessage); 
      customAlertDialogFragment.show(getApplicationContext().getSupportFragmentManager(), "TAG"); 
      sent.clear(); 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onCreate(); 
     // Register the receiver here 
    } 

    @Override 
    public void onPause() { 
     super.onCreate(); 
     // Un-register the receiver here 
    } 
} 

関連する問題