How to check which editext textwatcher listener is called in dynamically created edittext

大兔子大兔子 提交于 2019-12-13 12:48:02

问题


I am able to add Textwatcher listener for dynamically created Edittext so basically I'll check the first editext ontextchanged if there is any value create another edittext and so on.How can check which edittext is called in the listener.

I have checked couple of links how-to-use-single-textwatcher-for-multiple-edittexts but the Ids are fixed in this case.

Code:

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

}

回答1:


If I understood correctly, the whole purpose of using a TextWatcher here is to dynamically add another EditText each time the previous was filled with text. For this purpose I'd simply remove the single TextWatcher instance when creating another one and add it to the new EditText. The solution uses a single TextWatcher, but differs from your request that within the single TextWatcher is only attached to one EditText at a time. Check my sample code (untested).


EDIT code below was edited to also remove unused EditTexts on focus change. The reason to not remove Views on text change is to give the user the opportunity to change previous entered input without destroying the row. Also note that the last row is never deleted. Depending on the expected number of rows, a ListView might be a better choice.

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

    }

}


来源:https://stackoverflow.com/questions/28679833/how-to-check-which-editext-textwatcher-listener-is-called-in-dynamically-created

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!