Android 如何在PagerAdapter幻灯片中跟踪edittext字段?
我在Android中使用了一个相当简单的自定义寻呼机适配器,我想跟踪edittext字段的内容,这样每个新幻灯片在输入时都会保留相同的文本。有人对此有什么见解吗?我猜我需要为文本更改设置一个侦听器,但我不确定该放在哪里。这是我的适配器:Android 如何在PagerAdapter幻灯片中跟踪edittext字段?,android,android-pageradapter,Android,Android Pageradapter,我在Android中使用了一个相当简单的自定义寻呼机适配器,我想跟踪edittext字段的内容,这样每个新幻灯片在输入时都会保留相同的文本。有人对此有什么见解吗?我猜我需要为文本更改设置一个侦听器,但我不确定该放在哪里。这是我的适配器: private class CustomPagerAdapter extends PagerAdapter { public int getCount() { return 3; } public Object ins
private class CustomPagerAdapter extends PagerAdapter {
public int getCount() {
return 3;
}
public Object instantiateItem(ViewGroup collection, int position) {
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(LAYOUT_INFLATER_SERVICE);
View view;
switch(position) {
case 0:
view = inflater.inflate(R.layout.slide0, null, false);
break;
case 1:
view = inflater.inflate(R.layout.slide1, null, false);
break;
case 2:
view = inflater.inflate(R.layout.slide2, null, false);
break;
default:
view = inflater.inflate(R.layout.slide0, null, false);
}
collection.addView(view,0);
return view;
}
@Override
public void destroyItem(ViewGroup arg0, int arg1, Object arg2) {
arg0.removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
mCurrentSlide = (View) object;
}
}
创建TextWatcher,然后将其添加到每个EditText:
TextWatcher tw = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
// Save the text to some global variable
}
};
EditText et = (EditText) findViewById(R.id.editText1);
EditText et2 = (EditText) findViewById(R.id.editText2);
et.addTextChangedListener(tw);
et2.addTextChangedListener(tw);
编辑:
TextWatcher[] tw = new TextWatcher[12];
for (int i = 0; i < tw.length; i++) {
tw[i] = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
// Save the text to some global variable array
txt_array[i] = s.toString();
}
};
}
for (int i = 0; i < et.length; i++) {7
et[i].addTextChangedListener(tw[i]);
}
在上面的代码中,没有简单的方法知道哪个EditText调用了事件。
在这种情况下,您需要为每个EditText提供自己的TextWatcher:
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
global_string_variable_for_et1 = s.toString();
}
});
Edit2:
TextWatcher[] tw = new TextWatcher[12];
for (int i = 0; i < tw.length; i++) {
tw[i] = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
// Save the text to some global variable array
txt_array[i] = s.toString();
}
};
}
for (int i = 0; i < et.length; i++) {7
et[i].addTextChangedListener(tw[i]);
}
TextWatcher[]tw=新的TextWatcher[12];
对于(int i=0;i
好的,我是这样做的:
在主类中设置成员变量:
mText = "";
在适配器类的InstanceItem()中设置textWatcher:
EditText edtSlide = (EditText)view.findViewById(R.id.edtSlide);
//Set a listener for the editText that updates the member variable on keystroke.
TextWatcher tw = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mText = s.toString();
}
};
edtSlide.addTextChangedListener(tw);
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
EditText text = (EditText)((View) object).findViewById(R.id.edtSlide);
text.setText(mText);
}
然后在适配器类的setPrimaryItem()方法中:
EditText edtSlide = (EditText)view.findViewById(R.id.edtSlide);
//Set a listener for the editText that updates the member variable on keystroke.
TextWatcher tw = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mText = s.toString();
}
};
edtSlide.addTextChangedListener(tw);
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
EditText text = (EditText)((View) object).findViewById(R.id.edtSlide);
text.setText(mText);
}
我可以通过放置一个TextWatcher来获得它,如下所示
notes = (EditText) itemView.findViewById(R.id.notesText);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
notedEnteredByUser = charSequence.toString();
Log.i("TEXTWATCHER", notedEnteredByUser);
}
@Override
public void afterTextChanged(Editable editable) {
}
};
notes.addTextChangedListener(textWatcher);
在实例化项中,我使用字符串notedenteredbyser 这可能不是标准的方法,但是可以为存储输入值的每个edittext设置一个静态字符串。当幻灯片膨胀时,将edittext设置为它对应的静态字符串。是的,这是我想的,但它会变得混乱,因为我有12张或更多的幻灯片。我将尝试提出一个更简洁的版本,但是如果我不能,我会检查你的答案,如果你担心代码太乱,你可以通过在循环中分配它们来创建一个TextWatcher数组。然后,您可以将每个et分配给不同的TextWatcher。我已经编辑了答案。