0

ネットワーク通信スレッドで問題が発生した場合に、ユーザーにメッセージを表示したいと思います。

このため、ハンドラーからダイアログを表示する必要があります。

これは正しい方法ですか? ハンドラー クラス内で FragmentManager を取得する方法が見つからないためです。

class ErrorMessageHandler extends Handler
{
    @Override
    public void handleMessage(Message msg) 
    {
        super.handleMessage(msg);

        AlertDialogFragment dialog = new AlertDialogFragment((String) msg.getData().get("MESSAGE"));

        dialog.show(FragmentManager, TAG)

     }  

}
4

3 に答える 3

1

しばらくして、本当に簡単な解決策を見つけました。

このメソッドを Service クラスに実装する必要があります。

void alert(String message) 
{
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(getApplication());
    alertDialog.setMessage(message);
    alertDialog.setNeutralButton("OK", null);
    alertDialog.create().show();
}

時々それは本当に簡単です:)

于 2013-02-08T09:29:57.940 に答える
0

受け取ったエラーメッセージ(または設定したい他のメッセージ)を文字列として含む簡単なトーストメッセージを表示してみませんか

たぶん私はあなたの質問を誤解しましたが、私にとってはそれは論理的であるように思われます。ネットワークエラーメッセージなどを表示するために、単純なトーストを使用しています。

Toast.makeText(context, text, duration).show();

あなたのコメントに続いて、別の解決策を提案することができます:

エラーが発生した場合は、確認ダイアログ(AlertDialog)を表示し、ユーザーがヘルプを読みたいかどうかを選択できるようにします。

    new AlertDialog.Builder(this)
    .setTitle("Network Error")
    .setMessage(An error occured, would you like to read the help section ...)
    .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
          // Open here the new view with the help message etc.
        }

    })
    .setNegativeButton(R.string.no, null)
    .show();

したがって、この場合、長いヘルプテキストでユーザーをすぐに煩わせることはありません。最初に、エラーが発生したことを彼に伝えます。問題の解決方法に関するヘルプを読みたい場合は、確認してさらに先に進むことができます。通常、ユーザーは大量のテキスト、特にヘルプの説明を読むことを好まないため、これはアプリの設計に適しています。

最後に、短いエラーメッセージとともにAlertdialogを表示し、ヘルプの確認を提案できます。そこでは、インターネット接続が有効になっているかどうかを確認したり、有効にする方法を説明したり、Wi-Fiを有効/無効にできる携帯電話のページに直接移動するボタンを提案したりするように招待できます。

于 2013-01-28T14:07:20.960 に答える
0

だから...私はこの問題を解決する方法を見つけましたが、それは完璧な方法ではありません(詳細はこの回答の下部にあります)。

最初に Messenger を作成します。

private Messenger AlertDialogMessenger = new Messenger(new AlertDialogMessageHandler());

2 番目のハンドラで、次のダイアログが表示されます。

class AlertDialogMessageHandler extends Handler
{

    @Override
    public void handleMessage(Message msg) 
    {
        super.handleMessage(msg);

        AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create();

        dialog.setTitle("Attention");
        dialog.setMessage((CharSequence) msg.getData().get("MESSAGE"));
        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() 
        {               
            @Override
            public void onCancel(DialogInterface dialog) 
            {
                //Do something
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() 
        {               
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
                //Do something
                dialog.dismiss();
            }
        });

        dialog.show();                              
    }

}

そして、メッセンジャーをサービスに送信する必要があります。

Intent intent = new Intent(this,MyService.class);
intent.putExtra(MainActivity.EXTRA_FROM_SERVICE_MESSENGER, this.AlertDialogMessenger);
this.bindService(intent, this.conn, Context.BIND_AUTO_CREATE);

サービスでは、メッセンジャーをキャッチする必要があります。

@Override
public IBinder onBind(Intent intent) 
{       
    this.AlertDialoMessenger = intent.getParcelableExtra(MainActivity.EXTRA_FROM_SERVICE_MESSENGER);
    return null;
}

次に、メッセージを送信してダイアログを表示できます。

Message msg = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("MESSAGE", "This is a test message");

msg.setData(bundle);
try 
{
    AlertDialoMessenger.send(msg);
} 
catch (RemoteException e1) 
{
    e1.printStackTrace();
}

以上です。

残念ながら、私の場合はこれを使用できません。これは、Activity (この場合は MainActivity) が 1 つしかない場合にのみ機能するためです。ダイアログはこのアクティビティにのみ表示されるためです。

私のプロジェクトでは、より多くのアクティビティがあるため、これを使用しても意味がありません。

「Network error」のような短いトースト メッセージを表示し、OptionsMenu にヘルプ ページを提供することにしました。

ミロスに感謝!そして、このコードが時々誰かに役立つことを願っています:)

于 2013-01-29T09:21:12.773 に答える