如何检查在动态创建的edittext中调用了哪个edittext文本观察器侦听器

问题描述 投票:0回答:2

我可以为动态创建的 Edittext 添加 Textwatcher 侦听器,所以基本上我会检查第一个 edittext ontextchanged 是否有任何值创建另一个 edittext 等等。如何检查侦听器中调用了哪个 edittext。

我检查了几个链接如何使用-single-textwatcher-for-multiple-edittexts但在这种情况下ID是固定的。

代码:

 public class MainActivity extends Activity {

    EditText textIn;
    Button buttonAdd;
    LinearLayout container;
    Button buttonShowAll;
    static int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        container = (LinearLayout) findViewById(R.id.container);
        LayoutInflater layoutInflater = (LayoutInflater) getBaseContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View addView = layoutInflater.inflate(R.layout.row, null);
        final EditText textOut = (EditText) addView.findViewById(R.id.textout);
        textOut.addTextChangedListener(watcher);

        container.addView(addView);

    }

    TextWatcher watcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

            // addView();

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            /*
             * int childcount = container.getChildCount(); for (int i=0; i <
             * childcount; i++){ View v = container.getChildAt(i);
             * 
             * if(i == (childcount -1)){ Toast.makeText(getApplicationContext(),
             * "Last count"+childcount, Toast.LENGTH_SHORT).show(); addView(); }
             * }
             */
        }
    };

    public void addView() {
        LayoutInflater layoutInflater = (LayoutInflater) getBaseContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View addView = layoutInflater.inflate(R.layout.row, null);
        final EditText textOut = (EditText) addView.findViewById(R.id.textout);
        textOut.addTextChangedListener(watcher);
        addView.setTag(count++);
        container.addView(addView);
    }

}
android android-edittext android-custom-view
2个回答
1
投票

如果我理解正确的话,这里使用

TextWatcher
的全部目的是在每次填充文本时动态添加另一个 EditText。为此,我只需在创建另一个 TextWatcher 实例时删除单个 TextWatcher 实例并将其添加到新的 EditText 中即可。该解决方案使用单个 TextWatcher,但与您的请求不同,单个 TextWatcher 一次仅附加到一个 EditText。检查我的示例代码(未经测试)。


下面的编辑代码经过编辑,还删除了焦点更改时未使用的 EditText。不删除文本更改视图的原因是让用户有机会更改先前输入的输入而不破坏行。另请注意,最后一行永远不会被删除。根据预期的行数,ListView 可能是更好的选择。

public class MainActivity extends Activity {

    private LinearLayout mContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContainer = (LinearLayout) findViewById(R.id.container);
        ReusableTextWatcher reusableTextWatcher = new ReusableTextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0) addView(this);
            }

            @Override
            public void onListenerRemoved(final View parentView, final EditText editText) {
                editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                    @Override
                    public void onFocusChange(View v, boolean hasFocus) {
                        if (!hasFocus && editText.getText().length() == 0) mContainer.removeView(parentView);
                    }
                });
            }
        };
        addView(reusableTextWatcher);
    }

    private void addView(ReusableTextWatcher reusableTextWatcher) {
        final View addView = LayoutInflater.from(this).inflate(R.layout.row, mContainer);
        reusableTextWatcher.listenTo(addView, R.id.textout);
        mContainer.addView(addView);
    }

    private static abstract class ReusableTextWatcher implements TextWatcher {

        private View mParentView;
        private EditText mCurrentEditText;

        public void listenTo(View parentView, int editTextViewId) {
            if (mCurrentEditText != null) {
                mCurrentEditText.removeTextChangedListener(this);
                onListenerRemoved(mParentView, mCurrentEditText);
            }
            mParentView = parentView;
            mCurrentEditText = (EditText) parentView.findViewById(editTextViewId);
            mCurrentEditText.addTextChangedListener(this);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public abstract void onListenerRemoved(View parentView, EditText editText);

    }

}

0
投票

创建一个线性布局来容纳所有视图。 当文本更改时,只需计算具有空 editText 的视图数量。 如果没有空的 editText,则创建一个新的 editText 并向其添加相同的侦听器。 如果有多个editText,删除多余的editText。

numTextWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            int numberOfViews = 0;
            Log.d(TAG, "onTextChanged: "+s.toString());
            for(int i = llNumbers.getChildCount(); --i>=0;)
            {
                View view = llNumbers.getChildAt(i);
                EditText et_num = view.findViewById(R.id.et_data);
                String s1 = et_num.getText().toString();
                if(s1.length() == 0)
                    numberOfViews++;

                if(numberOfViews == 2) {
                    llNumbers.removeViewAt(i);
                    numberOfViews--;
                }
            }

            if(numberOfViews == 0)
                createNumView(new Number("", 2));
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
 };

void createNumView(Number n)
{
    String number = n.number;
    int type[] = new int[]{n.numberType};

    View view = LayoutInflater.from(AddContactActivity.this).inflate(R.layout.data_per_contact, llNumbers, false);
    EditText et_num = view.findViewById(R.id.et_data);
    et_num.setText(number);
    et_num.setHint("Number");
    et_num.addTextChangedListener(numTextWatcher);
}
© www.soinside.com 2019 - 2024. All rights reserved.