入力チェック有りのViewPager(1)

先日書いた 「ViewPager で入力画面を作る」は、汎用的ではない。
汎用性の為に、書き直す。

Action barで next の有効性をセットする interface を用意する。

public interface IActionMenuController{
   public void setNextEnable(boolean enable);
}

各ページの Fragment の基底クラスとして以下を定義する
この IActionMenuController の setNextEnable を入力チェックの結果
である abstract boolean isValidate() の結果で実行する。
また、ページの Fragment 内で制御する必要がある場合の処理の為に
abstract void sholdNextEnable(boolean enable) を実行する


import android.app.Fragment;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
/**
 * EntryBaseFragment
 */

public abstract class EntryBaseFragment extends Fragment{
   protected abstract boolean isValidate();
   protected abstract void sholdNextEnable(boolean enable);

   @Override
   public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setRetainInstance(true);
   }
   @Override
   public void onActivityCreated(Bundle savedInstanceState){
      super.onActivityCreated(savedInstanceState);
      setRetainInstance(true);
   }
   class InputValidator implements TextWatcher{
      @Override
      public void afterTextChanged(Editable s){
         boolean b = isValidate();
         ((IActionMenuController)getActivity()).setNextEnable(b);
         sholdNextEnable(b);
      }
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after){
      }
      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count){
      }
   }
   @Override
   public void onConfigurationChanged(Configuration newConfig){
      super.onConfigurationChanged(newConfig);
      boolean b = isValidate();
      *1.setNextEnable(b);
   }
}

実装する、ページ毎の Fragment の例は、、、

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
/**
 * Entry2Page
 */

public class Entry2Page extends EntryBaseFragment{
   private ImageButton mNextImageButton;
   private EditText editText2;

   public static Entry2Page create(Bundle args){
      Entry2Page fragment = new Entry2Page();
      fragment.setArguments(args);
      return fragment;
   }
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
      setRetainInstance(true);
      ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.entry2, container, false);
      *2.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            // getActivity() を実行して前ページへの Action を実行
         }
      });
      mNextImageButton = (ImageButton)viewGroup.findViewById(R.id.action_nextImageButton);
      mNextImageButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            // getActivity() を実行して次ページへの Action を実行
         }
      });

      editText2 = (EditText)viewGroup.findViewById(R.id.editText2);
      editText2.addTextChangedListener(new InputValidator());

      return viewGroup;
   }
   @Override
   protected boolean isValidate(){
      boolean rtn = true;
      if (editText2.getText().toString().trim().length()==0){
         rtn = false;
         editText2.setError("必須");
      }
      return rtn;
   }

   @Override
   protected void sholdNextEnable(boolean enabled){
      mNextImageButton.setEnabled(enabled);
   }

   public String getEmail(){
      return editText2.getText().toString().trim();
   }
}

次回の投稿で、Activity を書く。

*1:IActionMenuController)getActivity(

*2:ImageButton)viewGroup.findViewById(R.id.action_prevImageButton