先日書いた 「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 を書く。