gpt4 book ai didi

java - 如何将 Fragment 的上下文转换为界面

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:59 25 4
gpt4 key购买 nike

我想通过 interfaceAsyncTask 类返回一个值。问题是我的以下代码在 Activity 中运行良好,但在 fragment 类中运行不正常。

我得到了这样的 ClassCastException:

java.lang.ClassCastException: com.demo.HomeActivity cannot be cast to com.demo.helper.OnTaskCompleteListener
at com.demo.util.JSONParseAsync.<init>(JSONParseAsync.java:33)
at com.demo.fragment.PersonalDetailFragment.loadProfileAction(PersonalDetailFragment.java:93)
at com.demo.fragment.PersonalDetailFragment.onCreate(PersonalDetailFragment.java:81)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1942)

接口(interface)类:

public interface OnTaskCompleteListener {

void onTaskComplete(JSONObject jsonObject);

}

PersonalDetailFragment 类:

public class PersonalDetailFragment extends Fragment  implements OnTaskCompleteListener {
private View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_personal_detail, container,
false);
loadProfileAction();
return view;
}
private void loadProfileAction() {

SessionPreference preference = new SessionPreference(getActivity());
try {
String encodedUrl = URLEncoder.encode(preference.getSessionId(), "UTF-8")
+ ","
+ URLEncoder.encode(Constants.URL_TOKEN, "UTF-8");
// URL base64Encode
String processUrl = Base64.encodeToString(encodedUrl.getBytes("UTF-8"), Base64.DEFAULT);

JSONParseAsync parseAsync = new JSONParseAsync(getContext()); // also try getActivity()
parseAsync.execute((URLConstants.GET_USER_DETAIL_URL+processUrl).trim());

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

}
@Override
public void onTaskComplete(JSONObject jsonObject) {
try {

boolean status = jsonObject.getBoolean(URLConstants.TAG_STATUS);

Log.e(Constants.DEBUG_TAG, "Status:- " + status);

if (status == true) {
JSONArray dataarray = jsonObject.getJSONArray(URLConstants.TAG_DATA);
JSONObject data = dataarray.getJSONObject(0);
fillProfileData(data);

} else if (status == false) {
Snackbar.make(view,
"Incorrect User Name OR Password",
Snackbar.LENGTH_LONG).show();
}

Log.i("GARG", "Excution Line Finish ");
} catch (Exception e) {
e.printStackTrace();
}
}

JSONParseAsync 类:

public class JSONParseAsync extends AsyncTask<String, String, JSONObject>{

private Context mContext;

ProgressDialog mProgress;
private OnTaskCompleteListener mCallback;

public JSONParseAsync(Context context){
this.mContext = (AppCompatActivity)context;
this.mCallback = (OnTaskCompleteListener) mContext;
}

@Override
protected JSONObject doInBackground(String... URL) {
JSONObject jsonObj = null;

try{
Log.d(Constants.DEBUG_TAG, "line excucation 2 doInBackground");
ServiceHandler sh = new ServiceHandler();
String url = URL[0];
Log.d(Constants.ACTIVITY_TAG, "...." + url);
// Making a request to url and getting response.

String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

Log.d(Constants.JSON_TAG, "" + jsonStr);

if (jsonStr != null) {

jsonObj = new JSONObject(jsonStr);
Log.e(Constants.JSON_TAG, "" + jsonObj);

}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return jsonObj;
}

@Override
protected void onPreExecute() {
Log.d(Constants.DEBUG_TAG, "line excucation 1 onPreexcute");
mProgress = new ProgressDialog(mContext);
mProgress.setMessage("Downloading nPlease wait...");
mProgress.show();
}

@Override
protected void onProgressUpdate(String... values) {
Log.d(Constants.DEBUG_TAG, "line excucation 3 onProgressUpdate");
mProgress.setMessage(values[0]);
}


@Override
protected void onPostExecute(JSONObject result) {
Log.d(Constants.DEBUG_TAG, "line excucation 3 onPostExecute");
mProgress.dismiss();
//This is where you return data back to caller
Log.d(Constants.APP_TAG, " final result:- "+result);
mCallback.onTaskComplete(result);
}

}

请帮帮我:

最佳答案

通过这样做

JSONParseAsync parseAsync = new JSONParseAsync(getContext());

您正在将 Activity 发送到您的 AsyncTask,但实现 OnTaskCompleteListener 的是您的 Fragment

或者让您的Activity实现您的界面,或者

这样做:

JSONParseAsync parseAsync = new JSONParseAsync(this, getContext());

并将您的 AsyncTask 构造函数更改为

public JSONParseAsync(OnTaskCompleteListener listener, Context context){
this.mContext = context;
//this.mContext = (AppCompatActivity)context; -> you don't need that cast, AppCompatActivity is a subclass of Context
this.mCallback = listener;
}

关于java - 如何将 Fragment 的上下文转换为界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com