我正在尝试隐藏进度条并在onPostExecute()
的片段中的编辑文本上设置错误消息,但我的应用仍然崩溃。我需要一些关于如何正确执行此操作的帮助。我将对此项目的片段进行大量更新,因此我需要知道从OnPostExecute()
方法更新片段的正确方法。
我尝试创建Fragment
类的对象,然后使用我尝试访问EditText
的对象和名为showProgress()
的progressBar方法但我得到运行时错误。
protected void onPostExecute(String result) {
super.onPostExecute(result);
String jsonStr = result;
SellerRegisterFragment sr = new SellerRegisterFragment();
Toast toast = null;
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
String query_result = jsonObj.getString("query_result");
if (query_result.equals("SUCCESS")) {
toast = null;
Toast.makeText(context, "Registered successfully. You can now Login", Toast.LENGTH_SHORT).show();
if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
context.startActivity(new Intent(context, SellerLoginOrRegisterActivity.class));
}
}
else if (query_result.equals("DUPLICATE")) {
toast = null;
Toast.makeText(context, "Account for the given URL already exists", Toast.LENGTH_SHORT).show();
sr.showProgress(false);
}
else if (query_result.equals("FAILURE")) {
Toast.makeText(context, "Data could not be inserted. Signup failed.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Couldn't connect to remote database.", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(context, "Error parsing JSON data."+"...... "+ jsonStr, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "Couldn't get any JSON data.", Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:2)
您正在onPostExecute中创建Fragment实例。然后使用Fragment的成员变量。只是创建Fragment的实例不会做任何事情。
您必须将片段添加到活动中。只有这样才能执行Fragment的回调。在那些回调中(如onCreate,onCreateView),您将创建EditText,ProgressBar的实例。
如果您在不将片段添加到活动的情况下使用这些变量,您将获得NullPointerException。
我猜是,你已经在活动中添加了一个片段。您正在创建一个新实例,并在onPostExecute中使用该实例,而不是使用该Fragment实例。
答案 1 :(得分:0)
您的错误日志清楚地说明了问题。
Fragment SellerRegisterFragment{1b16e429} not attached to Activity
问题是您在将SellerRegisterFragment附加到活动之前尝试调用该方法。
FragmentS与活动相关联,您可以在Android文档here中找到说明。
我对以下LOC中的逻辑有疑问
SellerRegisterFragment sr = new SellerRegisterFragment();
您想在SellerRegisterFragment
的现有实例上调用方法吗?如果是这样,那么您可以轻松使用broadcast
。
如果没有,那么您需要创建一个新实例,然后使用FragmentManager
执行transaction
,然后commit
执行transaction
。