【问题标题】:How to display ProgressDialog bar within a fragment?如何在片段中显示 ProgressDialog 栏?
【发布时间】:2015-06-28 07:03:20
【问题描述】:

我想在从 Fragment 执行的 AsyncTask 期间显示 ProgressDialog。 我面临的问题是在 AsyncTask 期间没有显示进度对话框,我不知道为什么。

这里是异步任务:

public class RankTask extends AsyncTask<Void, Void, ArrayList<RowRank>> {

    private ProgressDialog pDialog;
    private Context context;

    public RankTask(Context context) {
        super();
        this.context = context;

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(context);
        pDialog.setMessage("Loading...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();

    }

    @Override
    protected ArrayList<RowRank> doInBackground(Void... params) {

        IDBInteraction interaction = new DBInteraction(
                Connection.getConnection());

        return interaction.getRank();
    }

    @Override
    protected void onPostExecute(ArrayList<RowRank> result) {

        pDialog.dismiss();
        super.onPostExecute(result);
    }

}

这是执行 AsyncTask 的 Fragment:

public class RankFragment extends Fragment {

private TableLayout tableLayout;
private static float SIZE_TEXT = 20;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(
            com.example.testintro.R.layout.fragment_rank, container, false);
    tableLayout = (TableLayout) rootView
            .findViewById(R.id.table_rank_layout);
    tableLayout.setStretchAllColumns(true);
    tableLayout.bringToFront();

    RankTask task = new RankTask(getActivity());
    try {

        createTable(task.execute().get());

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
    return rootView;
}

这是提交Fragment的Activity的代码行:

private void changeActivity(Button button, final Fragment fragment) {
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();
            fragmentTransaction.replace(R.id.container, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

        }
    });

【问题讨论】:

  • 有什么错误什么的吗?
  • 没有错误,只是没有进度对话框,但是从 AsynctTask 返回的对象,它是正确的并且运行良好。
  • 我猜问题是try catch 块。可能是,你应该把try catch放在doInBackground里面

标签: android android-fragments android-asynctask progressdialog


【解决方案1】:

我猜..这是由于“上下文”问题..正确传递上下文..

在您的片段中添加了此代码..

   public Context context;
    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        context = activity;
    }

【讨论】:

    【解决方案2】:

    与进度对话框或片段无关 你唯一的错误是你正在使用

    task.execute().get()
    

    如果需要,它将等待计算完成,然后检索其结果。

    因为它在主线程上运行,所以你不能使用任何视图删除 get(),它应该可以正常工作

    【讨论】:

    • 谢谢。那么我该怎么做才能从 AsyncTask 中检索结果呢?
    • task.execute() 并在 doInBackground 中检索您的数据,并在执行后使用此数据来更新您的 UI
    • 如果我尝试写 task.execute();没有结果,会显示进度对话框,但我没有数据。你是什​​么意思“在执行后使用这些数据,因为你喜欢更新你的用户界面”:如何在没有 get() 方法的情况下将数据传递给活动?我有这个代码:@Override protected void onPostExecute(Report report) { this.dialog.dismiss(); super.onPostExecute(报告); }
    • 我的意思是你使用异步任务的返回值来执行以下操作 createTable(task.execute().get());所以代替你在执行后调用下面的 createTable(report);两者都是一样的
    • 所以,你建议我为片段创建一个接口,使用方法 public void createTable(report) 并在 onPostExecute() 中调用该方法,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多