Je me bloque pour mon application. Fondamentalement, j'ai un fragment dans lequel une boîte de dialogue doit être affichée dans un scénario. J'avais créé la boîte de dialogue en étendant le fragment de dialogue. Le problème est que certains utilisateurs ne s'écrasent pas dans une exception Null Pointer.
Ceci est l'extrait de dialogue: l'application se bloque à la 2e ligne. De Crosslytics, j'ai eu la trace de pile suivante: p> 0. Crashed: Main: 0 0 0 0x0000000000000000 H1>
public class VerifyOTPDialog extends DialogFragment implements OnClickListener {
private static final String TAG_NAME = VerifyOTPDialog.class.getSimpleName();
private Context ctx;
private Dialog dialog;
private boolean isLaterVisible;
private String strTitle, strBtnTitle, strFragment = "";
private BroadcastReceiver broadcastReceiver;
private ProfileAddressContactInfoModel userModel;
private VerifyOTPDialogDismissed verifyOTPDialogDismissed;
public static final String RECEIVE_OTP = "com.myapp.ACTION_RECEIVED";
private ImageView imgViewForClose;
private RobotoRegularEditTextView editTextForOTP;
private RobotoBoldTextView btnLater, btnVerifyAndProceed;
private RobotoLightTextView txtViewForTitle, txtViewForResendOTP;
public popFragmentListener mPopFragmentListener;
public VerifyOTPDialog() {
}
public static VerifyOTPDialog newInstance(String strTitle, boolean isLaterVisible, String strBtnTitle, String strFragment) {
VerifyOTPDialog dialog = new VerifyOTPDialog();
Bundle b = new Bundle();
b.putString("title", strTitle);
b.putBoolean("isLaterVisible", isLaterVisible);
b.putString("btnTitle", strBtnTitle);
b.putString("strFrom", strFragment);
dialog.setArguments(b);
return dialog;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = getActivity();
registerReceiver();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = super.onCreateDialog(savedInstanceState);
dialog.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(android.content.DialogInterface dialog, int keyCode, android.view.KeyEvent event) {
if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) {
AppUtil.hideKeyboard();
return true;
} else
return false;
}
});
return dialog;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.verify_otp_popup, container, false);
Bundle b = getArguments();
strTitle = b.getString("title");
isLaterVisible = b.getBoolean("isLaterVisible");
strBtnTitle = b.getString("btnTitle");
strFragment = b.getString("strFrom");
getDialog().setCanceledOnTouchOutside(false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0));
userModel = AppUtil.getUserProfile();
imgViewForClose = (ImageView) view.findViewById(R.id.imgViewForClose);
editTextForOTP = (RobotoRegularEditTextView) view.findViewById(R.id.editTextForOTP);
btnLater = (RobotoBoldTextView) view.findViewById(R.id.btnLater);
btnVerifyAndProceed = (RobotoBoldTextView) view.findViewById(R.id.btnVerifyAndProceed);
txtViewForTitle = (RobotoLightTextView) view.findViewById(R.id.txtViewForTitle);
txtViewForResendOTP = (RobotoLightTextView) view.findViewById(R.id.txtViewForResendOTP);
if (userModel != null)
txtViewForTitle.setText(strTitle + " +91 " + userModel.getContactInfo().getMobilePhone());
txtViewForResendOTP.setText(getUnderlinedContent());
if (!isLaterVisible)
btnLater.setVisibility(View.GONE);
btnVerifyAndProceed.setText(strBtnTitle);
imgViewForClose.setOnClickListener(this);
txtViewForResendOTP.setOnClickListener(this);
btnLater.setOnClickListener(this);
btnVerifyAndProceed.setOnClickListener(this);
return view;
}
public interface VerifyOTPDialogDismissed {
void dialogDismissing(String... s);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
}
public VerifyOTPDialogDismissed getDialogDismissListener() {
return verifyOTPDialogDismissed;
}
public void setDialogDismissListener(VerifyOTPDialogDismissed VerifyOTPDialogDismissed) {
this.verifyOTPDialogDismissed = VerifyOTPDialogDismissed;
}
private void registerReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(RECEIVE_OTP);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String strOTP = intent.getExtras().getString("otp");
if (strOTP != null && editTextForOTP != null)
editTextForOTP.setText(strOTP);
}
};
ctx.registerReceiver(broadcastReceiver, intentFilter);
}
private SpannableString getUnderlinedContent() {
SpannableString content = new SpannableString(getResources().getString(R.string.resend_otp));
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
content.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.blue_button)), 0, content.length(), 0);
return content;
}
private void sendOTP(HashMap<String, String> params) {
Response.Listener<JSONObject> responseListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Logger.debugMessage("Response Object", response.toString());
String responseCode = response.getString("code");
if (responseCode.equalsIgnoreCase("success")) {
String message = response.getString("message");
Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show();
} else if (responseCode.equalsIgnoreCase("failed")) {
if (response.has("error")) {
if (response.has("error_code")) {
String error_code = response.optString("error_code");
displayMessageAlert(response.optString("error"), "", error_code);
} else {
displayMessageAlert(response.optString("error"), "", "");
}
} else if (response.has("errors")) {
JSONArray errorsArray;
try {
errorsArray = response.getJSONArray("errors");
Toast.makeText(ctx, errorsArray.getString(0), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
};
Api.sendOTP(params, responseListener, errorListener);
}
private void verifyOTP(HashMap<String, String> params, final String strFragment) {
Response.Listener<JSONObject> responseListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Logger.debugMessage("Response Object", response.toString());
String responseCode = response.getString("code");
if (responseCode.equalsIgnoreCase("success")) {
if (userModel != null) {
userModel.setPhoneVerified(true);
userModel.setOTPVerified(true);
AppUtil.saveUserProfile(userModel);
}
VerifyOTPDialog.this.dismissAllowingStateLoss();
String event_name = "";
if (strFragment.equalsIgnoreCase("SellFragment")) {
event_name = "otp_verified_on_sell";
MainActivity.getInstance().pushFragment(SellFragment.newInstance(), SellFragment.class.getSimpleName(), true);
} else if (strFragment.equalsIgnoreCase("QuickSellFragment")) {
event_name = "otp_verified_on_quick_sell";
MainActivity.getInstance().pushFragment(new QuickSellFragment(), QuickSellFragment.class.getSimpleName(), true);
} else if (strFragment.equalsIgnoreCase("gotoPaymentFlow")) {
event_name = "otp_verified_on_payment";
DraftSummaryFragment.getInstance().gotoPaymentFlow();
} else if (strFragment.equalsIgnoreCase("gotoPlaceBidPage")) {
event_name = "otp_verified_on_place_bid";
verifyOTPDialogDismissed.dialogDismissing(strFragment);
} else if (strFragment.equalsIgnoreCase("make_best_offer")) {
event_name = "otp_verified_on_make_best_offer";
verifyOTPDialogDismissed.dialogDismissing(strFragment);
} else if (strFragment.equalsIgnoreCase("checkAvailableFees")) {
event_name = "otp_verified_on_quick_sell";
QuickSellDraftSummaryFragment.getInstance().checkAvailableFees();
} else if (strFragment.equalsIgnoreCase("home_screen")) {
event_name = "otp_verified_for_casual_seller";
} else if (strFragment.equalsIgnoreCase("my_profile")) {
event_name = "otp_verified_from_my_profile";
} else if (strFragment.equalsIgnoreCase("my_profile")) {
event_name = "otp_verified_from_my_profile";
} else if (strFragment.equalsIgnoreCase("pro_seller_profile_settings")) {
event_name = "otp_verified_from_pro_seller_profile_settings";
} else if (strFragment.equalsIgnoreCase("pro_seller_welcome")) {
event_name = "otp_verified_from_pro_seller_welcome";
} else if (strFragment.equalsIgnoreCase("seller_badges")) {
event_name = "otp_verified_from_seller_badges";
} else if (strFragment.equalsIgnoreCase("trust_factor")) {
event_name = "otp_verified_from_trust_factor";
} else if (strFragment.equalsIgnoreCase("ProSellerDashboard"))
MainActivity.getInstance().pushFragment(ProSellerDashboardFragment.newInstance(false), ProSellerDashboardFragment.class.getSimpleName(), true);
else
event_name = "otp_verified_from_my_account";
JSONObject post = BetaOutAPIs.getPostDataForUserAdd(userModel, "update");
JSONArray eventArray = new JSONArray();
JSONObject event = new JSONObject();
event.put("name", event_name);
event.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
eventArray.put(event);
post.put("events", eventArray);
BetaOutAPIs.sendEventToBetaOut(post, TAG_NAME);
BaseApplication.getInstance().trackMoEngageEvents(event_name, new PayloadBuilder().build());
} else if (responseCode.equalsIgnoreCase("failed")) {
btnVerifyAndProceed.setEnabled(true);
if (response.has("error")) {
if (response.has("error_code")) {
String error_code = response.optString("error_code");
displayMessageAlert(response.optString("error"), "", error_code);
} else {
displayMessageAlert(response.optString("error"), "", "");
}
} else if (response.has("errors")) {
Toast.makeText(ctx, response.optString("errors"), Toast.LENGTH_SHORT).show();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
};
Api.verifyOTP(params, responseListener, errorListener);
}
private boolean validateOTP() {
String validationMessage = "";
boolean isValid = true;
String email = editTextForOTP.getText().toString();
if (email.length() == 0) {
isValid = false;
validationMessage = "Please Enter OTP";
Toast.makeText(getActivity(), validationMessage, Toast.LENGTH_SHORT).show();
}
return isValid;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imgViewForClose:
VerifyOTPDialog.this.dismissAllowingStateLoss();
break;
case R.id.txtViewForResendOTP:
if (userModel != null) {
HashMap<String, String> params = new HashMap<String, String>();
params.put("user_id", AppSharedPref.getUserId());
params.put("phone", userModel.getContactInfo().getMobilePhone());
sendOTP(params);
}
break;
case R.id.btnLater:
VerifyOTPDialog.this.dismissAllowingStateLoss();
if (mPopFragmentListener != null)
mPopFragmentListener.gotoRootFragment();
if (strFragment.equalsIgnoreCase("SellFragment")) {
MainActivity.getInstance().pushFragment(SellFragment.newInstance(), SellFragment.class.getSimpleName(), true);
} else if (strFragment.equalsIgnoreCase("QuickSellFragment")) {
MainActivity.getInstance().pushFragment(new QuickSellFragment(), QuickSellFragment.class.getSimpleName(), true);
} else if (strFragment.equalsIgnoreCase("gotoPlaceBidPage")) {
//verifyOTPDialogDismissed.dialogDismissing();
} else if (strFragment.equalsIgnoreCase("ProSellerDashboard"))
MainActivity.getInstance().pushFragment(ProSellerDashboardFragment.newInstance(false), ProSellerDashboardFragment.class.getSimpleName(), true);
break;
case R.id.btnVerifyAndProceed:
if (validateOTP()) {
btnVerifyAndProceed.setEnabled(false);
HashMap<String, String> map = new HashMap<String, String>();
map.put("user_id", SharedPref.getUserId());
map.put("code", editTextForOTP.getText().toString());
verifyOTP(map, strFragment);
}
break;
default:
break;
}
}
protected void displayMessageAlert(String message, String title, final String error_code) {
String s = "Alert";
if (title != null && title.length() > 0) {
s = title;
}
if (message != null) {
new AlertDialog.Builder(ctx).setTitle(s).setMessage(message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (error_code.toLowerCase().equals("logout")) {
AppUtil.logoutUser((MainActivity) ctx);
MainActivity.getInstance().pushFragment(LoginFragment.newInstance(true, true), LoginFragment.class.getSimpleName(), true);
}
dialog.dismiss();
}
}).show();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (broadcastReceiver != null) {
ctx.unregisterReceiver(broadcastReceiver);
}
}
public void setPopFragmentListener(popFragmentListener mPopFragmentListener) {
this.mPopFragmentListener = mPopFragmentListener;
}
public interface popFragmentListener {
void gotoRootFragment();
}
}
4 Réponses :
Vous devez obtenir le gestionnaire de fragments avant:
Testez la nullité p> fragmentManager fragman = getupportfragmentmanager (); code> p>
runOnUiThread(new Runnable() {
public void run() {
// do stuff on the ui like display fragments
}
});
Si vous provenez du fragment, utilisez J'aime: p> getchildfragmentManager () code>:
Mais cela est disponible auprès de l'API 17. Aussi j'utilise Android.app.fragment
Ensuite, vous devez utiliser android.support.v4.app.dialogfragment code> pour DialogFRAGment et pour le fragment Utilisez
android.support.v4.app.fragment code>. Vous devez étendre
fragmentationactivité code> ou
AppCompaticotivité code> dans votre activité. De cette façon, vous pouvez obtenir
getchildfragmentmanager () code> en fragment au-dessous de l'API 17.
Vous avez dit que vous utilisez Le support pour les fragments imbriqués dans Android n'était pas disponible dans l'API 11. Le support pour les fragments imbriqués a commencé à partir de l'API 17 et à l'avance. Si vous souhaitez utiliser des fragments imbriqués dans l'API 11 - 16, vous devez utiliser les fragments de la bibliothèque de support. p>
Vous devez donc faire votre boîte de dialogue de type android.app.fragment code> pour héberger votre fragment. Comme vous effectuez la boîte de dialogue à l'aide de la boîte de dialogue Android, le fragment de dialogue lui-même est un fragment, ce qui en fait un cas de fragments imbriqués dans Android. Lorsque nous nichons des freaments, nous utilisons
getchildfragmentManager (). Code> p>
android.support.v4.app.dialogfragment code> et votre fragment de type
android.support.v4.app.fragment code> < / p>
Je recommanderais d'appeler le em> dialogment em> de l'activité mère afin que vous ne rencontrez pas de problèmes avec le cycle de vie du fragment. Depuis que vous essayez probablement d'avoir les fragments communiquer les uns avec les autres, cela devrait être fait à travers l'activité. p>
Voici plus d'informations - https://developer.android.com/training /basics/fragments/communicating.html p>
Suivre les étapes: P>
La dernière étape est l'endroit où vous pouvez appeler le dialogue de ligne de dialogue, puis la boîte de dialogue renvoie l'activité des données, puis transmettez-la au fragment d'appel. P>
Pouvez-vous s'il vous plaît mettre votre VerifyotPdialog ici
Appelez-vous
show () code> en fragment?
Appelez-vous
Afficher code> à l'intérieur de la tâche ASYNC?
@Vishalpatoliya a posté VerifyotPDialog. Jetez un coup d'oeil s'il vous plait
@ G4S8 Je n'appelle pas Show en AsynccTask
@Akshaybhat Oui, j'appelle Afficher la boîte de dialogue du fragment
Vous utilisez V4 ou Appdragment ??
@Vishalpatoliya j'utilise android.app.fragment
Pouvez-vous essayer de supprimer cette boîte de dialogue @override publique surCreateDialog (Bundle SavedInstancestate)
Ok je vais essayer de vous faire connaître le résultat. Le plus gros problème est que nous ne pouvons pas comprendre quand cela se produit.