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); } }
额外优化点
- 字符串比较:原代码
i != "1"是错误写法,字符串比较必须用equals()方法 - WebView设置去重:将重复配置抽成
initWebViewSettings()方法,代码更简洁 - 数值边界处理:添加
value > 1判断,防止Previous按钮导致数值为0或负数 - 空值处理:获取EditText内容时添加
trim()和空值判断,避免Integer.parseInt()抛出异常
内容的提问来源于stack exchange,提问作者Subash Bhandari
相关产品推荐
相关产品推荐

