You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中监听EditText值变化并刷新WebView的实现方法

问题描述

我在Android Studio开发的应用中,设有Next按钮与WebView组件,点击按钮时网站会随数值更新自动刷新,但当用户在EditText中输入或修改数值时,WebView并未随之重新加载。需要实现当EditText的值发生改变或输入新值时,自动重新加载WebView的功能。

当前代码
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class phy_btn extends AppCompatActivity {
    TextView justme;
    EditText data;
    Button btn, next;
    String half;
    String i, nuller;
    public static String Extra_name = "1";
    WebView webView;
    NetworkChangeListener networkChangeListener = new NetworkChangeListener();

    @Override
    protected void onStart() {
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeListener, filter);
        super.onStart();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_btn);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.toolbar_title);
//        justme = findViewById(R.id.nit);
        query quu = new query(this);
        data = findViewById(R.id.enter);
        btn=findViewById(R.id.previous);
        next= findViewById(R.id.next);
        i = "1";
        webView =findViewById(R.id.web);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setSupportZoom(true);
        webView.setKeepScreenOn(true);
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webView.getSettings().setAppCacheEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Practical");
        getSupportActionBar().setSubtitle("Physical Botany");
        // enter code here

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                quu.linkker( new query.VolleyCallback(){
                    @Override
                    public void linkker(String date, String numer, String answer1, String imag1) {
                        i = data.getText().toString();
                        int value = Integer.parseInt(i);
                        value++;
                        String nepali = Integer.toString(value);
                        half = date.split(".app/")[0];
                        String killer = half+".app/btnphy/"+nepali+".html";
                        data.setText(nepali);
                        webView.loadUrl(killer);
                    }
                });
            }
        });


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                quu.linkker( new query.VolleyCallback(){
                    @Override
                    public void linkker(String date, String numer, String answer1, String imag1) {
                        i = data.getText().toString();
                        int value = Integer.parseInt(i);
                        value--;
                        String nepali = Integer.toString(value);
                        half = date.split(".app/")[0];
                        String killer = half+".app/btnphy/"+nepali+".html";
                        data.setText(nepali);
                        webView.loadUrl(killer);
                        if (i != "1") {
                            webView.loadUrl(killer);
                        }
                    }
                });
            }
        });


        quu.linkker( new query.VolleyCallback(){
            @Override
            public void linkker(String date, String numer, String answer1, String imag1) {
                half = date.split(".app/")[0];
                String killer = half+".app/btnphy/"+i+".html";
//                justme.setText(killer);
                if (i != "1") {
                    webView.loadUrl(killer);
                }
                webView.loadUrl(killer);
            }
        });
    }
}
解决方案

核心是给EditText添加文本变化监听器(TextWatcher),同时优化代码复用性,避免重复逻辑:

步骤1:抽取URL生成与WebView加载的公共方法

把生成URL并加载WebView的逻辑抽成独立方法,方便按钮点击和文本变化时调用:

// 新增方法:根据数值加载对应网页
private void loadWebPage(String number, String baseUrl) {
    if (baseUrl == null || baseUrl.isEmpty()) return;
    half = baseUrl.split("\\.app/")[0]; // 转义点号,避免正则匹配错误
    String targetUrl = half + ".app/btnphy/" + number + ".html";
    webView.loadUrl(targetUrl);
}

步骤2:给EditText添加TextWatcher监听器

在onCreate方法中添加监听,实时响应EditText内容变化:

// 给EditText添加文本变化监听
data.addTextChangedListener(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) {
        String input = s.toString().trim();
        if (!input.isEmpty() && half != null) {
            loadWebPage(input, half + ".app/");
        }
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

步骤3:优化按钮点击逻辑

替换原有重复代码为调用公共方法,同时修复字符串比较错误:

修改Next按钮回调

next.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        quu.linkker(new query.VolleyCallback() {
            @Override
            public void linkker(String date, String numer, String answer1, String imag1) {
                String current = data.getText().toString().trim();
                if (current.isEmpty()) current = "1";
                int value = Integer.parseInt(current);
                value++;
                String newNumber = Integer.toString(value);
                data.setText(newNumber);
                loadWebPage(newNumber, date);
            }
        });
    }
});

修改Previous按钮回调

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        quu.linkker(new query.VolleyCallback() {
            @Override
            public void linkker(String date, String numer, String answer1, String imag1) {
                String current = data.getText().toString().trim();
                if (current.isEmpty()) current = "1";
                int value = Integer.parseInt(current);
                if (value > 1) {
                    value--;
                }
                String newNumber = Integer.toString(value);
                data.setText(newNumber);
                loadWebPage(newNumber, date);
            }
        });
    }
});

完整修改后的代码

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class phy_btn extends AppCompatActivity {
    TextView justme;
    EditText data;
    Button btn, next;
    String half; // 设为成员变量,方便监听器访问
    String i, nuller;
    public static String Extra_name = "1";
    WebView webView;
    NetworkChangeListener networkChangeListener = new NetworkChangeListener();
    query quu; // 设为成员变量,避免重复初始化

    @Override
    protected void onStart() {
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeListener, filter);
        super.onStart();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_btn);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.toolbar_title);
//        justme = findViewById(R.id.nit);
        quu = new query(this);
        data = findViewById(R.id.enter);
        btn=findViewById(R.id.previous);
        next= findViewById(R.id.next);
        i = "1";
        webView =findViewById(R.id.web);
        // 初始化WebView设置(去重)
        initWebViewSettings();

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Practical");
        getSupportActionBar().setSubtitle("Physical Botany");

        // 给EditText添加文本变化监听
        data.addTextChangedListener(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) {
                String input = s.toString().trim();
                if (!input.isEmpty() && half != null) {
                    loadWebPage(input, half + ".app/");
                }
            }

            @Override
            public void afterTextChanged(Editable s) {}
        });

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                quu.linkker(new query.VolleyCallback() {
                    @Override
                    public void linkker(String date, String numer, String answer1, String imag1) {
                        String current = data.getText().toString().trim();
                        if (current.isEmpty()) current = "1";
                        int value = Integer.parseInt(current);
                        value++;
                        String newNumber = Integer.toString(value);
                        data.setText(newNumber);
                        loadWebPage(newNumber, date);
                    }
                });
            }
        });

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                quu.linkker(new query.VolleyCallback() {
                    @Override
                    public void linkker(String date, String numer, String answer1, String imag1) {
                        String current = data.getText().toString().trim();
                        if (current.isEmpty()) current = "1";
                        int value = Integer.parseInt(current);
                        if (value > 1) {
                            value--;
                        }
                        String newNumber = Integer.toString(value);
                        data.setText(newNumber);
                        loadWebPage(newNumber, date);
                    }
                });
            }
        });

        quu.linkker(new query.VolleyCallback() {
            @Override
            public void linkker(String date, String numer, String answer1, String imag1) {
                half = date.split("\\.app/")[0];
                loadWebPage(i, date);
            }
        });
    }

    // 初始化WebView设置的公共方法
    private void initWebViewSettings() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
        WebSettings settings = webView.getSettings();
        settings.setAppCacheEnabled(true);
        settings.setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        settings.setDomStorageEnabled(true);
        settings.setSupportZoom(true);
        settings.setBuiltInZoomControls(true);
        webView.setKeepScreenOn(true);
        webView.setWebViewClient(new WebViewClient());
    }

    // 根据数值加载对应网页的公共方法
    private void loadWebPage(String number, String baseUrl) {
        if (baseUrl == null || baseUrl.isEmpty() || number == null || number.isEmpty()) return;
        half = baseUrl.split("\\.app/")[0];
        String targetUrl = half + ".app/btnphy/" + number + ".html";
        webView.loadUrl(targetUrl);
    }
}

额外优化点

  1. 字符串比较:原代码i != "1"是错误写法,字符串比较必须用equals()方法
  2. WebView设置去重:将重复配置抽成initWebViewSettings()方法,代码更简洁
  3. 数值边界处理:添加value > 1判断,防止Previous按钮导致数值为0或负数
  4. 空值处理:获取EditText内容时添加trim()和空值判断,避免Integer.parseInt()抛出异常

内容的提问来源于stack exchange,提问作者Subash Bhandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:41:17