2016-05-15 44 views
2

在我的表单片段硬件“后退”按钮工作不正确。例如,当我打开片段,并且当我没有开始输入时,我按下了“返回”按钮,这非常棒。但是,当我开始打字和键入后按硬件“返回”按钮应用程序崩溃没有任何错误日志。键入edittext后硬件“返回”按钮不起作用

我的形式片段

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

} 

我的形式片段是孩子片段。而这个父母片段,我实现了反向行动。

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

回答

0

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

    } 
}; 

创建TextWatcher将它添加到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; 
      } 
     }); 
0

在您的泡沫在父片段片段(子片段)

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

片段通过分片管理其由活动称为管理;因此,要控制点击后退按钮时要执行的操作,您必须在活动中执行该操作;

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

当设置你的片段时,你应该给它们一个标签,然后稍后使用这个标签来findFragmentByTagName()并做一个if检查以查看当前设置了哪个片段;

让我知道你是否需要对此进行任何澄清。

相关问题