0

バックグラウンドでタスクを実行している間などButtons、すべての UI 要素を無効にできる Android SDK のメソッドはありますか?MenuItems

私は現在、インターネット上でいくつかの作業を行っておりProgressBar、現在の進行状況についてユーザーに通知するメッセージを表示しています。

メソッドを介してバックグラウンド タスクの開始時と終了時List<>にすべてのButtonsandを作成し、それらの状態を更新するだけでよいでしょうか?MenuItemssetEnabled

4

1 に答える 1

2

バックグラウンドでタスクを実行している間、ボタンやメニュー項目などのすべての UI 要素を無効にできる Android SDK のメソッドはありますか?

そのようなメソッドが SDK に存在したことを思い出せません。

すべての Buttons と MenuItems の List<> を構築し、setEnabled メソッドを介してバックグラウンド タスクの開始時と終了時にそれらの状態を更新する必要がありますか?

私のアドバイスはProgressDialog、現在のアプローチの代わりに a を使用することです (ダイアログは、ユーザーが UI と対話することも防ぎます。メニューを無効にするだけです)。バックグラウンド ワーカーを開始し、すべての UI ビューを無効にすると、ユーザーは何らかの作業が行われ、アプリを使用できないことがわかります。私にとって、これは紛らわしいDialogようで、作業が完了するまでユーザーが待たなければならないことを明確に示しているため、はるかに優れたソリューションのようです。もう 1 つのオプションはProgressBar、アクティビティを覆うオーバーレイに を配置することです。これが必要な場合、ユーザーは引き続き以下の UI を見ることができます。

すべてのビューを無効にするには、次のような方法を使用します。

private void changeViewsState(ViewGroup parent, boolean state) {
    int count = parent.getChildCount();
    for (int i = 0; i < count; i++) {
        View child = parent.getChildAt(i);
        if (child instanceof ViewGroup) {
            changeViewsState((ViewGroup) child, state);
        } else if (child instanceof View) {
            child.setEnabled(state);
        }
    }
}

システムのコンテンツ パネル ( changeViewsState((ViewGroup) findViewById(android.R.id.content), false);) またはアクティビティのレイアウトのルートを渡します。

ViewGroup root; // root is a reference of the root of your content view
// in the onCreate method

root = (ViewGroup) getLayoutInflater().inflate(R.layout.your_activity_layout_file, null);

// later use it:
changeViewsState(root, false);

メニュー項目を無効にするには、バックグラウンド作業が開始されようとしているときに設定されるブール フラグがあり、そのフラグを使用して callback でメニュー項目を有効/無効にしますonPrepareOptionMenu。作業が終了したら、メニューが有効になるようにフラグを元に戻すことを忘れないでください。

于 2012-08-10T06:38:28.540 に答える