8
votes

Android: Fragment Manager devient NULL

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: xxx pré>

l'application se bloque à la 2e ligne. De Crosslytics, j'ai eu la trace de pile suivante: p> xxx pré>

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();
}
}


10 commentaires

Pouvez-vous s'il vous plaît mettre votre VerifyotPdialog ici


Appelez-vous show () en fragment?


Appelez-vous Afficher à 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.


4 Réponses :


4
votes

Vous devez obtenir le gestionnaire de fragments avant:

fragmentManager fragman = getupportfragmentmanager (); code> p>

Testez la nullité p>

runOnUiThread(new Runnable() {
    public void run() {
        // do stuff on the ui like display fragments
    }
});


0 commentaires

1
votes

Si vous provenez du fragment, utilisez getchildfragmentManager () :

J'aime: xxx


2 commentaires

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 pour DialogFRAGment et pour le fragment Utilisez android.support.v4.app.fragment . Vous devez étendre fragmentationactivité ou AppCompaticotivité dans votre activité. De cette façon, vous pouvez obtenir getchildfragmentmanager () en fragment au-dessous de l'API 17.



1
votes

Vous avez dit que vous utilisez android.app.fragment 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 ().

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.

Vous devez donc faire votre boîte de dialogue de type android.support.v4.app.dialogfragment et votre fragment de type android.support.v4.app.fragment < / p>


0 commentaires

0
votes

Je recommanderais d'appeler le dialogment 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é.

Voici plus d'informations - https://developer.android.com/training /basics/fragments/communicating.html

Suivre les étapes:

  1. Définissez l'interface
  2. Implémentez l'interface
  3. livrer un message à un fragment

    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.


0 commentaires