【问题标题】:Android call function once after text has changed inside fragment文本在片段内更改后Android调用函数一次
【发布时间】:2014-07-18 14:47:01
【问题描述】:

我试图在文本更改后的一段时间后调用一个函数。我设置了延迟,但由于某种原因,我的函数被调用了两次。这是我的代码:

public class ExampleFragment extends Fragment {


private EditText mText;
private Handler mHandler;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    mHandler = new Handler();

    View rootView = inflater.inflate(R.layout.fragment_start_process, container, false);     

    mText = (EditText) rootView.findViewById(R.id.editText1);

    mText.addTextChangedListener(new TextWatcher() {

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

        }

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

        }

        @Override
        public void afterTextChanged(final Editable s) {

            // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)    

            System.out.println("TEXT CHANGE" + s);              

            final Runnable r = new Runnable() {

                @Override
                public void run() {
                    final Editable x = s;
                    System.out.println("DELAY TEXT " + xEditable);                      
                }
            };              
            mHandler.postDelayed(r, 1000);
        }
    });        

    return rootView;
}

我的 System.out.println 语句如下所示:

文本更改 H

文本更改嗨

延迟文本嗨

延迟文本嗨

所以看起来当我将我的函数放入可运行时,它会运行两次。我只希望它运行一次(延迟文本应该只显示一次)。任何想法我做错了什么?我的整个目标是在文本更改后等待一段时间(以确保文本完全上传),然后运行我的函数一次。我已经读过可以使用 AsyncTask ,但我对此并不熟悉。任何帮助将不胜感激。

【问题讨论】:

    标签: java android multithreading android-fragments android-asynctask


    【解决方案1】:

    您的 Runnable 执行了两次,因为 afterTextChanged() 在每个键入的字符之后被调用。

    如果您想在用户开始输入后 1 秒后执行某些代码,您可以在 runnable 中添加一个标志以使其只运行一次。

     private boolean mFlag = true;
    
    
     @Override
     public void afterTextChanged(final Editable s) {
    
        // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)    
    
        Log.w(TAG, "TEXT CHANGE " + s);
    
        final Runnable mRunnable = new Runnable() {
            @Override
            public void run(){
                final Editable x = s;
                Log.w(TAG, "DELAY TEXT " + x.toString());
            }
        }
    
        if(mFlag){
            mHandler.postDelayed(r, 1000);    
            mFlag = false;
        }
    
    }
    

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多