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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:57:02