2016-05-15 6 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

あなたのフォームでは、その後、バックプレスイベントでリスナーを削除

edt_phone.addTextChangedListener(textWatcher); 

ようedt_phoneに追加します

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

    } 
}; 

よう

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

TextWatcherを作成します。あなたの親フラグメントでフラグメント(子フラグメント)

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フラグをチェックしてその時点で設定されているフラグメントを確認します。

同じことを明確にする必要がある場合はお知らせください。