在我使用内容之前,EditText会清除

时间:2019-05-14 14:51:12

标签: android android-edittext

我正在尝试在WebSocket中实现一个Android Studio客户端。

我的代码工作正常,但是我想在设置数据后清除文本框。在单击“发送”按钮后尝试清除EditText框时,我发现它们在使用前已被清除。

如果我使用以下代码,则会发送文本框的内容,

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        start  = (Button) findViewById(R.id.send);
        output = (TextView) findViewById(R.id.output);
        client = new OkHttpClient();
        add    = (EditText) findViewById(R.id.add_str);
        cmd    = (EditText) findViewById(R.id.cmd_str);
        key    = (EditText) findViewById(R.id.key_str);
        data   = (EditText) findViewById(R.id.data_str);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start();
            }
        });
    }

但是,如果我使用以下内容...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    start  = (Button) findViewById(R.id.send);
    output = (TextView) findViewById(R.id.output);
    client = new OkHttpClient();
    add    = (EditText) findViewById(R.id.add_str);
    cmd    = (EditText) findViewById(R.id.cmd_str);
    key    = (EditText) findViewById(R.id.key_str);
    data   = (EditText) findViewById(R.id.data_str);

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            start();
            add.getText().clear();
            cmd.getText().clear();
            key.getText().clear();
            data.getText().clear();
        }
    });
}

我刚收到一个空字符串。如何停止呢?我尝试设置仅在文本发送后才设置的发送标志...

start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        start();
        if (sent){
            add.getText().clear();
            cmd.getText().clear();
            key.getText().clear();
            data.getText().clear(); 
            sent = false; 
        }
    }
});

...但是文本永远不会被清除。

编辑#1:完整的MainActivity列表

package qdivision.org.websocketexample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

public class MainActivity extends AppCompatActivity {

    private Button start;
    private TextView output;
    private OkHttpClient client;

    public EditText add;
    public EditText cmd;
    public EditText key;
    public EditText data;

    public boolean sent = false;


    private final class EchoWebSocketListener extends WebSocketListener {
        private static final int NORMAL_CLOSURE_STATUS = 1000;

        @Override
        public void onOpen(WebSocket webSocket, Response response) {

            String addStr    = add.getText().toString();
            String cmdStr    = cmd.getText().toString();
            String keyStr    = key.getText().toString();
            String dataStr   = data.getText().toString();
            String dataFrame = "<" + addStr + "," + cmdStr + "," + keyStr + "," + dataStr + ">";
            webSocket.send(dataFrame);

            webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
            sent = true;
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            output("Receiving : " + text);
        }

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            output("Receiving bytes : " + bytes.hex());
        }

        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            webSocket.close(NORMAL_CLOSURE_STATUS, null);
            //output("Closing : " + code + " / " + reason);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            output("Error : " + t.getMessage());
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        start  = (Button) findViewById(R.id.send);
        output = (TextView) findViewById(R.id.output);
        client = new OkHttpClient();
        add    = (EditText) findViewById(R.id.add_str);
        cmd    = (EditText) findViewById(R.id.cmd_str);
        key    = (EditText) findViewById(R.id.key_str);
        data   = (EditText) findViewById(R.id.data_str);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start();
                /*add.getText().clear();
                cmd.getText().clear();
                key.getText().clear();
                data.getText().clear();*/
            }
        });
    }

    private void start() {
        Request request = new Request.Builder().url("ws://192.168.1.84:81/").build(); //"ws://echo.websocket.org"
        EchoWebSocketListener listener = new EchoWebSocketListener();
        WebSocket ws = client.newWebSocket(request, listener);

        client.dispatcher().executorService().shutdown();
    }

    private void output(final String txt) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                output.setText(output.getText().toString() + "\n\n" + txt);
            }
        });
    }
}

4 个答案:

答案 0 :(得分:1)

首先,关于sent flag。如果您正在使用另一个线程来设置其值,这并不意味着该线程必须等待它读取值。在if statement中,如果不正确,它将跳过正文。因此,假设start()在另一个线程上运行,则一旦调用start(),该线程将读取下一条语句并跳过循环。 尝试使用您所使用的API随附的OnCompleteListener()之类的东西。 editText.getText().clear()具有相同的逻辑。如果您尝试在任何HTTP调用后读取start()中的文本,则程序将不会等待它并执行其余的语句。 希望有帮助

答案 1 :(得分:1)

由于onOpen是异步发生的,因此您尝试传递的值已经被清除。最简单的方法是将EditTexts中的值分配给变量,然后在onOpen中读取它们。您还可以在Websocket实现中添加一个接受String作为参数的构造函数。

答案 2 :(得分:0)

也许您可以尝试:

data.setText(""); 

答案 3 :(得分:-1)

editText.getText().clear(); 

将清除文本框。