硬件"back"按钮在输入编辑文本后不起作用



在我的表单片段中,硬件"返回"按钮工作不正确。例如,当我打开片段时,当我没有开始打字时,我按下硬件"后退"按钮,它的工作非常好。但当我开始打字后,按下硬件"后退"按钮,应用程序崩溃了,没有任何错误日志。

我的表单碎片

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

我的表单片段是子片段。这个父片段是我实现backaction的地方。

  @Override
        public void onResume() {
            super.onResume();
            getView().setFocusableInTouchMode(true);
            getView().requestFocus();
            getView().setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                        backAction();
                        return true;
                    }
                    return false;
                }
            });
        }
public  void backAction() {
        if (getChildFragmentManager().getBackStackEntryCount() > 0) {
            getChildFragmentManager().popBackStack();
        }
        else  {
            ((MainActivity) getActivity()).setCurrentItem(0, true);
        }
    }

创建类似的TextWatcher

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_phone

edt_phone.addTextChangedListener(textWatcher);

然后在反按事件中删除侦听器

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

在您的泡沫碎片(子碎片)中

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

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

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

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

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

最新更新