2

バックグラウンドhttp操作の結果として、フォアグラウンドアクティビティにダイアログを表示する必要があります。

ダイアログが表示されなければならないとき、それはどこにでもある可能性があり、コンテキストを変更することができます。たとえば、新しいアクティビティを開始しました。

applicationContextを使用してダイアログを表示すると、次のようになります。

05-04 17:32:32.560:E / AndroidRuntime(3663):android.view.WindowManager $ BadTokenException:ウィンドウを追加できません-トークンnullはアプリケーション用ではありません

だから...どうすれば私の目標を達成できますか?

助言がありますか?

4

4 に答える 4

2

ダイアログを作成するときはいつでもどこでも、あなたは正しい活動になりますか?そのアクティビティをコンテキストとして使用しないのはなぜですか?

私自身のコードでは、ダイアログを作成するヘルパークラスを作成します。そのヘルパークラスに、現在のアクティビティ、タイトル、メッセージを渡します。ダイアログを作成し、管理できるAlertDialogオブジェクトを返します。

それを試すこともできますが、ダイアログを表示するコンテキスト/アクティビティを知る必要があります。

于 2012-05-04T15:53:51.483 に答える
0

フォアグラウンドアクティビティに操作が完了したことを通知する方法が必要です。これは、リスナーを登録することで実行できます。コードを投稿していないため、想定します。

私が知っているフォアグラウンドアクティビティに通知する方法は2つあります。最初の方法はブロードキャストインテントを使用する方法です。ここでは、アクティビティ内のAndroidBroadcastReceiverに関連する質問があります。バックグラウンド操作からブロードキャストインテントを起動し、アクティビティを受信者として登録できます。

こちらをご覧くださいhttp://developer.android.com/reference/android/content/Context.html#sendOrderedBroadcast%28android.content.Intent,%20java.lang.String,%20android.content.BroadcastReceiver,%20android.os.Handler 、%20int、%20java.lang.String、%20android.os.Bundle%29およびここ http://developer.android.com/reference/android/content/BroadcastReceiver.html

2番目の方法は、たとえば(擬似コード)バックグラウンド操作を実行するリスナーをクラスに登録することです。

@Override
protected void onResume() {
    BackgroundOperator.registerListener(this);
}

@Override
protected void onPause() {
    BackgroundOperator.unregisterListener(this);
}

public void onOperationComplete(...) {
    // TODO: Show your dialog here
}

リスナーが次のようなものになる可能性がある場合(アクティビティで実装できます):

interface BackgroundOperatorListener {
    void onOperationComplete(...);
}

ここでの考え方は、フォアグラウンドアクティビティが現在登録されているリスナーになるため、onOperationComplete(...)コールバックの受信者になり、ダイアログを表示できます。...は、渡す引数をいくつでも指定できます。操作が完了したときにあなたの活動に。

于 2012-05-04T15:59:34.597 に答える
0

必要なのは、タスクの最上位のアクティビティ(現在の表示アクティビティ)を取得し、それを使用してダイアログを表示することだと思います。

したがって、このスレッドを参照してください:最上位のアクティビティの識別子を取得する方法は?

編集:バックグラウンドからダイアログを表示することは、優れたユーザーエクスペリエンスではありません。通知を送信するか、長時間乾杯することができます。

于 2012-05-04T16:00:56.873 に答える
0

私の意見では、最良の方法は、1つの新しいアクティビティを作成し、それをダイアログのように使用することです。手順:

  1. たとえば、(元の)MainActivyなどの新しいアクティビティを作成します。

  2. 必要に応じて、関連付けられたactivity_main.xmlに入力します。

  3. AndroidManifest.xmlで、この行を書き直します。

    <activity
            android:theme="@style/AppTheme.Dialog"
            android:name="com.myapp.original.example"
            android:label="@string/timy_titlle" >
    
  4. Intentクラスを使用する他のアクティビティから、Dialogに変換されたMainActivityを呼び出します。

アクションバーコンパクトを使用している場合は、この他の手順に従うことができます。

于 2014-04-02T21:34:35.060 に答える