Android实现带URL输入的WebView应用启动闪退问题求解
修复步骤
1. 解决主题不兼容报错(闪退直接原因)
找到项目下res/values/styles.xml(或res/values/themes.xml)文件,修改AppTheme的父主题为MaterialComponents或AppCompat子类,示例如下:
<!-- 原有父主题不符合要求才会触发报错,替换为如下配置即可,原有自定义主题配置可保留 --> <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
如果你暂时不需要使用TextInputLayout组件,也可以直接删除activity_url.xml里的TextInputLayout代码块,也能临时解决该报错,更推荐修改主题适配Material组件规范。
2. 修复业务逻辑错误
2.1 调整UrlActivity代码
UrlActivity不需要继承MainActivity,同时调整View初始化顺序、删除不合理的自动跳转逻辑、改用Intent传值避免内存泄漏:
package com.example.app; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class UrlActivity extends AppCompatActivity { private EditText link; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 必须先设置布局再查找控件,原有顺序会触发空指针异常 setContentView(R.layout.activity_url); link = findViewById(R.id.link); } public void gotourl(View view){ String inputUrl = link.getText().toString().trim(); if(inputUrl.isEmpty()) { Toast.makeText(this, "Please Enter URL", Toast.LENGTH_SHORT).show(); return; } // 通过Intent传递URL,禁止用静态变量跨Activity传值,会导致内存泄漏 Intent intent = new Intent(UrlActivity.this, MainActivity.class); intent.putExtra("TARGET_URL", "https://" + inputUrl); startActivity(intent); finish(); } }
2.2 调整MainActivity代码
修改Activity父类、补全URL接收逻辑:
package com.example.app; import android.annotation.SuppressLint; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private WebView mWebView; @Override @SuppressLint("SetJavaScriptEnabled") protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = findViewById(R.id.activity_main_webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.setWebViewClient(new MyWebViewClient()); // 接收传入的URL并加载 String targetUrl = getIntent().getStringExtra("TARGET_URL"); if(targetUrl != null) { mWebView.loadUrl(targetUrl); } } @Override public void onBackPressed() { if(mWebView.canGoBack()) { mWebView.goBack(); } else { super.onBackPressed(); } } // 请自行补全MyWebViewClient类的实现,原有代码缺失该类定义 }
3. 优化布局(可选)
现有TextInputLayout为空没有实际作用,可将EditText放到TextInputLayout内部,发挥浮动标签、错误提示等组件能力:
<com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="1dp" android:layout_marginTop="61dp" android:layout_marginEnd="1dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:hint="输入网址"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/link" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textUri" android:text="Enter URL"/> </com.google.android.material.textfield.TextInputLayout>
原有单独的EditText和对应约束可同步删除,减少布局冗余。
内容的提问来源于stack exchange,提问作者Hidayat Taufik
相关产品推荐
相关产品推荐

