0

互換性ライブラリv4+を使用しています。他のスレッドと開発ガイドに従って、それを作成するアクティビティから進行状況ダイアログを呼び出すフラグメントを作成しようとしています。このアプローチでは、 AsyncTaskの実行前に表示され、実行後に却下(削除)されたDialogFragmentを使用します。その結果、ダイアログが表示されません。実際、ダイアログはthread.sleepの最後にほんの一瞬しか表示されません。

誰かが私がどこが間違っているのか教えてもらえますか?

私はここに私の断片を持っています:

public class GroupsDetailsFragment extends BaseFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       // Inflate the layout for this fragment
       View v = inflater.inflate(R.layout.fragment_groups_details, container, false);

       return v;
    }



    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        loadPage();
    }



    public void loadPage() {
        Log.i(TAG, "loadPage");
        new LoadPageTask(getBaseActivity()).execute();
    }

    public void executeLoadPagePreExecution() {Log.i(TAG, "executeLoadPagePreExecution"); }
    public void executeLoadPageInBackground() {Log.i(TAG, "executeLoadPageInBackground"); }
    public void executeLoadPagePostExecution() {try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }Log.i(TAG, "executeRefreshPostExecution"); }



    protected class LoadPageTask extends AsyncTask<Void, Void, String> {
        private Context context;

        public LoadPageTask(Context context) {
            super();
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            // before the network request begins, show a progress indicator
            getBaseActivity().showLoadingProgressDialog(context);
            executeLoadPagePreExecution();
        }

        @Override
        protected String doInBackground(Void... params) {
            String result = executeLoadPage();
            Log.i(TAG, "error message result: " + result);
            return result;
        }


        // Returns null if Everything is OK. Error Message if any problem.
        private String executeLoadPage() {
            try {
                executeLoadPageInBackground();
                return null;
            } catch (Exception e){
                Log.w(TAG, e.getMessage(), e);
                return(e.getMessage());
            }
        }

        @Override
        protected void onPostExecute(String message) {
            executeLoadPagePostExecution();
            getBaseActivity().dismissProgressDialog();
            if (message!=null){
                Utility.showMessageAlertDialog(message, context);
            }
        }
    }

}

そして、フラグメントを支払うFragmentActivityの内部クラスであるProgressDialogFragment:

public static class ProgressDialogFragment extends DialogFragment {


        public static ProgressDialogFragment newInstance(String title, String message) {
            ProgressDialogFragment fragment = new ProgressDialogFragment();
            Bundle args = new Bundle();
            args.putString("title", title);
            args.putString("message", message);
            fragment.setArguments(args);

            return fragment;
        }

        @Override
        public ProgressDialog onCreateDialog(Bundle savedInstanceState) {
            String title = getArguments().getString("title");
            String message = getArguments().getString("message");

            ProgressDialog progressDialog = new ProgressDialog(getActivity());
            progressDialog.setTitle(title);
            progressDialog.setMessage(message);

            progressDialog.show();

            return progressDialog;
        }
    }


    public void showProgressDialog(String title, String message) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        Fragment prev = fragmentManager.findFragmentByTag("progress dialog");
        if(prev!=null) {
            fragmentTransaction.remove(prev);
        }
        fragmentTransaction.addToBackStack(null);

        DialogFragment newFragment = ProgressDialogFragment.newInstance(title, message);
        newFragment.show(fragmentManager, "progress dialog");
        //fragmentTransaction.commit();
    }

    public void removeProgressDialog() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        Fragment prev = fragmentManager.findFragmentByTag("progress dialog");
        if(prev!=null) {
            fragmentTransaction.remove(prev);
        }
        fragmentTransaction.commit();
    }
4

3 に答える 3

0

通常、UI スレッドを一時停止しないでください。では、Thread.Sleep() を doInBackground() に移動するのはどうですか? これはうまくいきますか?

于 2012-02-09T08:44:50.517 に答える
0

電話しなくてもいいと思う

onCreateDialog(...) の progressDialog.show()

于 2013-01-04T15:16:45.100 に答える