0

次のように宣言されたフラグメントを含む完全に機能するアプリがあります。

public class SearchableListFragment extends Fragment implements TabListener

フラグメントの作業中のある時点で、かなり遅いループを実行します。次のようなものを想像してください。

for(int i = 0;i < large_number;i++)
{
    // do complex maths
}

しかし、このループにはかなり長い時間がかかるため、ループ中に進行状況バーを表示したいと考えています。ダイアログを追加するさまざまな例を見てきましたが、一部がフラグメントに適用されないように見えるため、すべて失敗しているように見えます....または、単に適用されないものを想定しているため適用できません私の場合。プログレスバーを表示するコードでループをラップするにはどうすればよいですか (線形バーまたは渦巻く円のいずれか - 最も簡単なもの)。

編集:フラグメントは 内に展開されますSherlockFragmentActivity。また、フラグメントは次の方法で実装されていますandroid.support.v4.app.*

4

2 に答える 2

0

この質問をご覧になることをお勧めします: addView not visible in custom FrameLayout but clickable

特に、プログレスバーとコンテンツビューを切り替えるビューグループであり、レイアウト xml で簡単に使用できる「ソリューション」( http://pastebin.com/2xjnCDLS ) は、さまざまな点で非常に役立ちました。機会。コンテンツを読み込んだり計算を行ったりする前に showProgressbar() を呼び出し、後で showNext() を呼び出すだけです。

于 2013-10-07T14:12:34.767 に答える
0

私はモーダルの進行状況を表示するためにどこでも使用するこの ModalProgress クラスを持っています。そのまま使用できると思います。

public class ModalProgress extends DialogFragment {

public static void show(Activity activity, String title,
        String message) {
    if (activity == null) {
        return;
    }
    FragmentManager fm = activity.getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    hideInternal(ft, fm); 
    // Create and show the dialog.
    DialogFragment newFragment = new ModalProgress();
    Bundle args = new Bundle();
    args.putString("title", title);
    args.putString("message", message);
    newFragment.setArguments(args);
    newFragment.show(ft, "dialog");
}

private static void hideInternal(FragmentTransaction ft, FragmentManager fm) {
    Fragment prev = fm.findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
}

public static void hide(FragmentActivity activity) {
    if (activity == null) {
        return;
    }
    FragmentManager fm = activity.getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    hideInternal(ft, fm);
    ft.commit();
}

public ModalProgress() {
    setCancelable(false);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Bundle args = getArguments();
    ProgressDialog dialog = new ProgressDialog(getActivity());
    String title = args.getString("title");
    String msg = args.getString("message");
    if (!TextUtils.isEmpty(title)) {
        dialog.setTitle(title);
    }
    if (!TextUtils.isEmpty(msg)) {
        dialog.setMessage(msg);
    }
    return dialog;
} 
}

ループ コードを AsyncTask 内に移動します。

private class LongTask extends AsyncTask<Void, Void, Void> {
     protected void onPreExecute (){
          ModalProgress.show(getActivity(), "Working", "Please wait..."); 
     }
     protected Void doInBackground(Void... voids) { 
         for (int i = 0; i < count; i++) {
             // your loop here
         }
         return null;
     } 
     protected void onPostExecute(Void result) {
          ModalProgress.hide(getActivity());
     }
}

そして、実行するだけAsyncTaskです。

于 2013-10-07T14:15:03.950 に答える