4

代替テキスト http://img252.imageshack.us/img252/643/snakesonadialog.png

皆さん、こんにちは。

そのため、私はアプリケーションの最後の仕上げを行っていますが、アプリケーション全体にはまだ未解決の問題が 1 つあります。

Web からデータを取得している間、ProgressDialogs の形式でロード インジケーターを表示します。何らかの理由で、ProgressDialogs が別の空白のダイアログ ボックス内にネストされているように見えます。結果は粘着性があります。

私のレイアウトコードは次のようになります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Theme.MyTheme.EpisodeList">
    <ImageView android:src="@drawable/featured"
        android:layout_width="fill_parent"
        android:layout_height="50sp"
        android:layout_gravity="top"
        android:shadowRadius="0"
        android:shadowColor="#FFFFFF"
        android:id="@+id/header_image"
     />
   <ListView android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
   />
</LinearLayout>

ProgressDialog を表示するために使用するコードは次のとおりです。

// In my class definition
private ProgressDialog p;

// in my onCreate method
p = new ProgressDialog(EpisodeActivity.this, ProgressDialog.STYLE_SPINNER);
p.setMessage("Loading...");
p.show();

見た目からすれば、何の問題もありません。問題を説明するために写真も添付しています。

どんな助けでも大歓迎です!

4

2 に答える 2

2

数日間試行錯誤した後、ProgressDialogs を処理する最善の方法を見つけました。単純な ProgressDialogs を扱うことは、Android プラットフォームでは非常に複雑です。うまくいけば、将来的には(ドキュメントとともに)改善されるでしょう。これが私のベストプラクティスです。

空のダイアログ内の ProgressDialog のネストの問題は、2.1 または 2.2 システムで実行されている 2.0 より前のコードの問題のようです。show() メソッドが super.show() も呼び出していると推測できますが、これは 2.1 と 2.2 で異なる動作をします。

そのため、ProgressDialog オブジェクトで直接 show() を呼び出さない場合に最適であることがわかりました。代わりに、組み込みの showDialog() および onCreateDialog() メソッドを使用してダイアログを操作します。コード スニペットを次に示します。

private static final int ID_DIALOG_LOADING = 0;

@Override
protected void onCreate(Bundle tedBundy) {
    // Do stuff

    showDialog(ID_DIALOG_LOADING);

    // Do more stuff in a thread
}

@Override
public void run() {
  // Do some stuff in this thread
  handler.sendEmptyMessage(0);
}

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // Let adapters know the data under them have changed

        try {
            dimissDialog(ArticlesList.ID_DIALOG_LOADING);
            removeDialog(ArticlesList.ID_DIALOG_LOADING);
        } catch (Exception e) {}
    }
}

@Override
protected Dialog onCreateDialog(int id) {
    if (id == ID_DIALOG_LOADING) {
        ProgressDialog loadingDialog = new ProgressDialog(this);
        loadingDialog.setMessage("Loading...");
        loadingDialog.setIndeterminate(true);
        loadingDialog.setCancelable(true);
        return loadingDialog;
    }

    return super.onCreateDialog(id);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    try {
        Log.i("ArticlesList.onSaveInstanceState", "Chirp chirp");
        dismissDialog(ArticlesList.ID_DIALOG_LOADING);
        removeDialog(ArticlesList.ID_DIALOG_LOADING);
    } catch (Exception e) {

    }

    super.onSaveInstanceState(outState);
}

@Override
protected void onDestroy() {
    try {
        dismissDialog(ArticlesList.ID_DIALOG_LOADING);
        removeDialog(ArticlesList.ID_DIALOG_LOADING);
    } catch (Exception e) {

    }

    super.onDestroy();
}

@Override
protected void onPause() {
    try {
        dismissDialog(ArticlesList.ID_DIALOG_LOADING);
        removeDialog(ArticlesList.ID_DIALOG_LOADING);
    } catch (Exception e) {

    }

    super.onPause();
}

@Override
public void onDetachedFromWindow() {
    try {
        dismissDialog(ArticlesList.ID_DIALOG_LOADING);
            removeDialog(ArticlesList.ID_DIALOG_LOADING);
    } catch (Exception e) {

    }

    super.onDetachedFromWindow();
}

これは長いコード スニペットです。また、そのダイアログを強制終了しようとしている重複したコードの束も表示されます。これは、携帯電話が回転するたびに Android が View を破棄してから再作成するためです。うまくいけば、将来のバージョンでは、ユーザーが画面を回転させるたびにウィンドウが完全に破棄されて再ロードされなくなり、代わりに onScreenRotate() メソッドが実装されます。

いくつかの異なる方法を試した後、このハッキーなソリューションは、ProgressDialog を削除する一貫した迅速な結果を提供する唯一のもののようです。これにより、将来誰かの時間が数日節約されることを願っています。

于 2010-07-23T19:09:55.933 に答える
1

ダイアログを 2 つの手順で作成することで、同じ問題を修正しました。

ProgressDialog progressDia = new ProgressDialog(this);
progressDia.setProgressStyle(ProgressDialog.STYLE_SPINNER);
于 2011-06-23T07:09:07.880 に答える