Android “硬件”;“后退”;按钮不存在';在编辑文本中键入后无法工作

Android “硬件”;“后退”;按钮不存在';在编辑文本中键入后无法工作,android,android-fragments,Android,Android Fragments,在我的表单中,碎片硬件“后退”按钮工作不正常。例如,当我打开片段时,当我没有开始输入时,我按下硬件“后退”按钮,它的工作非常出色。但当我开始输入和输入后,按下硬件“后退”按钮应用程序崩溃,没有任何错误日志 我的表格碎片 public class D_Category_Login extends Fragment implements View.OnClickListener{ public static FragmentListItemClick fragmentListItemCl

在我的表单中,碎片硬件“后退”按钮工作不正常。例如,当我打开片段时,当我没有开始输入时,我按下硬件“后退”按钮,它的工作非常出色。但当我开始输入和输入后,按下硬件“后退”按钮应用程序崩溃,没有任何错误日志

我的表格碎片

public class D_Category_Login extends Fragment implements View.OnClickListener{


    public static FragmentListItemClick fragmentListItemClick;
    EditText edt_name,edt_lastname,edt_phone,edt_pass1,edt_pass2;
    String name="";
    DBHelper dbHelper;

    public static final String REGISTER_URL = "http://admin.unimax.kz/api/Klientapi/AddClient?";
    public static final String KEY_USERNAME = "first_name";
    public static final String KEY_LASTNAME = "last_name";


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.form_login, null);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Регистрация");
         edt_name = (EditText) view.findViewById(R.id.edt_firstname);
         edt_lastname = (EditText) view.findViewById(R.id.lastname);
        edt_phone = (EditText) view.findViewById(R.id.login);
        edt_pass1 = (EditText) view.findViewById(R.id.pass);
        edt_pass2 = (EditText) view.findViewById(R.id.pass_repeet);
        Button btn_submit = (Button) view.findViewById(R.id.btn_submit);
        TextView tv_number = (TextView) view.findViewById(R.id.tv_number);

        btn_submit.setOnClickListener(this);
        tv_number.setOnClickListener(this);


        edt_phone.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
//                 TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                if(!s.toString().contains("+7 ")){
                    edt_phone.setText("+7 ");
                    Selection.setSelection(edt_phone.getText(), edt_phone.getText().length());

                }

            }
        });

        return view;
    }

    void setfragmentclick(FragmentListItemClick fr){
        fragmentListItemClick = fr;
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_submit:{
                if (edt_name.getText().toString().trim().isEmpty() || edt_lastname.getText().toString().trim().isEmpty()){
                    if (edt_name.getText().toString().trim().isEmpty()) {
                        edt_name.setError("Заполните это поле");
                        requestFocus(edt_name);
                    }
                    if (edt_lastname.getText().toString().trim().isEmpty()) {
                        edt_lastname.setError("Заполните это поле");
                        requestFocus(edt_lastname);
                    }
                }
                else {
                    CheckInternet();

                }
            }
            break;
            case R.id.tv_number:{
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "+77079300066"));
                startActivity(intent);
            }
            break;
        }
    }

    void CheckInternet(){
        if (isOnline()){
            registerUser();

        }
        else {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getContext());
            alertDialogBuilder.setMessage("Проверьте подключение к Интернету");
            alertDialogBuilder.setPositiveButton("Закрыть", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    }
    public boolean isOnline() {
        ConnectivityManager cm =
                (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }
    void registerUser(){
        final String first_name = edt_name.getText().toString().trim();
        final String last_name = edt_lastname.getText().toString().trim();
        String fill_url = REGISTER_URL+"familia="+Uri.encode(last_name)+"&name="+Uri.encode(first_name);
        StringRequest stringRequest = new StringRequest(Request.Method.POST, fill_url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        dbHelper = new DBHelper(getContext());
                        final ContentValues cv = new ContentValues();
                        final SQLiteDatabase db = dbHelper.getWritableDatabase();
                        name+= String.valueOf(edt_name.getText()+" "+String.valueOf(edt_lastname.getText()));
                        cv.put("id_user", Integer.valueOf(response));
                        cv.put("name", name);
                        db.execSQL("delete from form_login");
                        db.insert("form_login",null, cv);
                        db.close();
                        dbHelper.close();
                        getFragmentManager().popBackStack();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getActivity(),"Ошибка сервера"+error.toString(),Toast.LENGTH_LONG).show();
                    }
                }){
            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<String, String>();
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getContext());
        requestQueue.add(stringRequest);
    }

    private void requestFocus(View view) {
        if (view.requestFocus()) {
            getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

}

创建
TextWatcher
like

TextWatcher textWatcher=new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(!s.toString().contains("+7 ")){
                edt_phone.setText("+7 ");
                Selection.setSelection(edt_phone.getText(), edt_phone.getText().length());

   }
};
将其添加到edt\U电话中

edt_phone.addTextChangedListener(textWatcher);
然后在back press事件中删除侦听器

getView().setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        edt_phone.removeTextChangedListener(textWatcher);
                    return true;
                    }
                }
                return false;
            }
        });
在你的泡沫碎片(子碎片)中

在父片段中执行此操作

public parentFragment extends Fragment implements childFragment.Communicator
{

@override
public void onCreatView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
childFragment.setCommunicator(this);
}

public void exitFragment()
  {
getActivity().finish();
   }
}

片段由活动调用的片段管理器管理;因此,要控制单击后退按钮时要执行的操作,必须在活动中执行该操作

现在,如果您有多个片段集,您应该使用标记来查找它们,检查它们是否可见,如果可见,请执行上面提到的操作

在设置片段时,您应该给它们一个标记,然后稍后使用该标记来查找fFragmentByTagname(),并进行if检查以查看此时设置了哪个片段

如果你需要澄清,请告诉我

Communicator communicator;

@Override
public void onBackPressed() {
super.onBackPressed();
communicator.exitFragment();
}

public void setCommunicator(Communicator communicator)
{
 this.communicator = communicator;
 }

public interface Communicator 
{
void exitFragment();
}
public parentFragment extends Fragment implements childFragment.Communicator
{

@override
public void onCreatView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
childFragment.setCommunicator(this);
}

public void exitFragment()
  {
getActivity().finish();
   }
}