【问题标题】:Showing Progress Dialog in ListFragment在 ListFragment 中显示进度对话框
【发布时间】:2014-02-05 05:46:55
【问题描述】:

我有一个从 ListFragment 扩展而来的类。我需要显示一个进度对话框,因为从服务器加载数据需要一些时间。我正在使用一个名为 MenuItemData 的私有类,并从 AsyncTask 扩展该类。在 onPreExecute 方法中我有这一行,

pDialog  = ProgressDialog.show(getActivity(), "Loading...", "Please wait...", false); //line 1

onPostExecute方法中,

pDialog.dismiss(); //line 2

现在,当我运行程序时,它会停止并给出 NullPointerException

但是当我评论这两行时,程序运行正常我认为问题在于 getActivity() 返回 null。

MenuItemData 类的代码

private class MenuItemData extends AsyncTask<String, String, String> {
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        try {
            if ((json_.getString(KEY_SUCCESS) != null)) {

                int success = Integer.parseInt(json_.getString(KEY_SUCCESS));

                if (success == 1) {

                    jsonArray = json_.getJSONObject("data").getJSONArray("items");
                    itemCount = jsonArray.length();
                    for (int i = 0; i < itemCount; i++) {
                        jsonObject = jsonArray.getJSONObject(i);
                        menuItems = new Menu_Items();
                        menuItems.setName(jsonObject.getString("name"));
                        menuItems.setDescription(jsonObject.getString("description"));
                        menuItems.setPrice("$"+jsonObject.getString("price"));
                        menu_itemsArrayList.add(menuItems);
                    }
                }
            }
        } catch (JSONException e) {
            Log.e("Menu Items2", e.toString());
        }


        pDialog.dismiss();



    }

    @Override
    protected void onPreExecute() {

        pDialog  = ProgressDialog.show(getActivity(), "Loading...", "Please wait...", false);

        super.onPreExecute();

    }

    @Override
    protected String doInBackground(String... params) {
        json_ = userFunctions.getMenuItems("Appetizers");
        return null;
    }
}

Logcat

02-05 11:25:24.245  28619-28619/com.burgerhot.main E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
        at android.app.AlertDialog.<init>(AlertDialog.java:98)
        at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
        at android.app.ProgressDialog.show(ProgressDialog.java:110)
        at android.app.ProgressDialog.show(ProgressDialog.java:99)
        at com.burgerhot.main.MenuCategory1$MenuItemData.onPreExecute(MenuCategory1.java:105)
        at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
        at android.os.AsyncTask.execute(AsyncTask.java:511)
        at com.burgerhot.main.MenuCategory1.setDataToMenu(MenuCategory1.java:61)
        at com.burgerhot.main.MenuCategory1.<init>(MenuCategory1.java:46)
        at com.burgerhot.main.MyAdapter.getItem(Menu.java:47)
        at com.burgerhot.main.MyAdapter.getItem(Menu.java:36)
        at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:97)
        at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
        at android.view.View.measure(View.java:12911)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4805)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
        at android.view.View.measure(View.java:12911)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:828)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:557)
        at android.view.View.measure(View.java:12911)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4805)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2097)
        at android.view.View.measure(View.java:12911)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
        at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2446)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4448)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
        at dalvik.system.NativeStart.main(Native Method)

MenuCategory1 类

public class MenuCategory1 extends ListFragment {

private UserFunctions userFunctions;
private static String KEY_SUCCESS = "success";
private JSONObject json_, jsonObject;
private JSONArray jsonArray;
int itemCount = 0;
private ProgressDialog pDialog;
private Menu_Items menuItems;
final private Context context=getActivity();
private ArrayList<Menu_Items> menu_itemsArrayList;
CustomAdapterForMenu myCustomAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}


public MenuCategory1() {
    userFunctions = new UserFunctions();
    setDataToMenu();
}

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

    myCustomAdapter = new CustomAdapterForMenu(getActivity(), R.layout.menu_category1, menu_itemsArrayList);
    /** Setting the list adapter for the ListFragment */
    this.setListAdapter(myCustomAdapter);
    return super.onCreateView(inflater, container, savedInstanceState);
}


private void setDataToMenu() {
    menu_itemsArrayList = new ArrayList<Menu_Items>();
    new MenuItemData().execute();
}

//private class goes here (mentioned above)

} 那么有没有办法解决这个问题呢? (显示进度对话框)

谢谢。

【问题讨论】:

  • 我猜你在安装对话框时设置了错误的上下文
  • 你能解释一下吗?
  • 这些行是在哪里写的。发布更多代码以获得更好的分析器。并发布完整日志
  • @chathura2020 你是怎么打电话给AsyncTask 的。是 AsyncTask 类是在您从 ListFragment 类扩展还是单独的类中。
  • 它的两个单独的类 1. MenuCategory1 扩展 ListFragment 2. MenuItemData 扩展 AsyncTask

标签: android progressdialog android-listfragment


【解决方案1】:

试试这个..

如下代码调用

new MenuItemData(getActivity()).execute();

在你的 AsyncTask 中使用 constructor

    Context context;

    public MenuItemData(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pDialog  = ProgressDialog.show(context, "Loading...", "Please wait...", false);

    }

【讨论】:

  • @chathura2020 在MenuCategory1 构造函数中删除setDataToMenu(); 方法并将其添加到onCreateView
  • @chathura2020 很高兴它有帮助。编码愉快!
【解决方案2】:

问题在于你的构造函数

public MenuCategory1() {
userFunctions = new UserFunctions();
setDataToMenu();
}

在构造函数中,getActivity() 返回 null,因为 Android 尚未“初始化”片段所需的后端内容。

尝试在 onViewCreated() 处移动 setDataToMenu(),这应该可以解决您的问题,因为 getActivity() 现在应该返回活动。

【讨论】:

    【解决方案3】:

    定义一个变量来存储上下文并使其成为最终的。在 AsyncTask 中使用 final 变量。

    final Context activity = getActivity();

    【讨论】:

    • 还可以尝试将进度对话框设为最终状态。匿名内部类方法要求事物是最终的。如果可能,发布更多代码。另外..我认为问题是因为您正在调用静态显示方法。你应该更好地执行此 ProgressDialog progressDialog = new ProgressDialog(getActivity(), ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(getActivity(), "标题", "消息", false); .......progressDialog.hide();
    • 我也试过第二种方法,还是有问题
    【解决方案4】:

    首先调用你的 super.onPreExecute() 并使用构造函数获取活动引用

    Activity act;
    MenuItemData(Activity a){
        act = a;
    }
    
    @Override
    protected void onPreExecute() {
         super.onPreExecute();
    
        pDialog  = ProgressDialog.show(act, "Loading...", "Please wait...", false);
    
    }
    

    从您的列表片段中调用它

    Activity act = this;
    new MenuItemData(act).execute();
    

    【讨论】:

      【解决方案5】:

      将对异步方法的调用移至 onactivitycreated。因为当你从构造函数调用它时,getactivity 将返回 null。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多