14

サーバーをポーリングするときに進行状況ダイアログを開かせようとしています。クラスはタブバー内にネストされているため、ActivityGroupです。ビューをフレーム内に維持するには、ActivityGroupが必要です。これが私のActivityGroupクラスの宣言です:

   public class CheckInActivity extends ActivityGroup{
        ...
        public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.checkin);
            new LocationControl().execute(this);

これで、AsyncTaskクラスは同じCheckInActivityClass内にあります。

private class LocationControl extends AsyncTask<Context, Void, Void>
    {
        private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);

        protected void onPreExecute()
        {
            this.dialog.setMessage("Determining your location...");
            this.dialog.show();
        }

指定されたアプリを実行すると、WindowManager$BadTokenExceptionに関連するエラーが発生します。不明なトークンでウィンドウを開始することはできません。通常のActivity(ActivityGroupではない)のサンプルアプリを作成してみましたが、問題なく動作しました。

これを変更して機能させる方法、またはプログレスバーをタブバー内にネストできるようにする回避策を知っている人はいますか?どんな助けでも大歓迎です。

4

3 に答える 3

22

ActivityGroupがTabActivity内にある場合、2つ以上のレベルを持つネストされたアクティビティがあります。Androidは現在これをサポートしていませんが、回避策があります。親アクティビティをダイアログに渡す必要があります。

この目的のために、アクティビティクラスでヘルパーメソッドを作成します。

private Context getDialogContext() {
    Context context;
    if (getParent() != null) context = getParent();
    else context = this;
    return context;
}

次に、行を変更します

private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);

private final ProgressDialog dialog = new ProgressDialog(getDialogContext());
于 2010-12-03T14:43:06.137 に答える
3

ここではシンプルで、以下も使用できます

private final ProgressDialog dialog = new ProgressDialog(getParent());

それは私にとって完璧に機能します。

于 2012-12-21T11:38:40.057 に答える
1

getParent()が機能しない場合は、単に使用してみてくださいTabsActivity.context(または親タブアクティビティクラスの名前に置き換えてください)。ネストされたアクティビティを使用していますが、その結果、getParent()を使用しても、ダイアログの正しいコンテキストが返されません。これは、直接の親ではなく、TabsActivityを拡張するアクティビティのコンテキストが必要なためです。

簡単な修正:

  1. TabsActivityクラスにコンテキスト変数を作成する必要があります。onCreateメソッドのようなものpublic static TabsActivity context;context=this

  2. ダイアログを作成する次の行を置き換えます。

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

と:

AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

そしてそれは魅力のように機能します。

于 2012-04-09T05:22:35.423 に答える