Деятельность WebView приводит к сбою приложения Android - PullRequest
0 голосов
/ 07 мая 2019

До сих пор никто не смог предоставить ответ или решение, которое решает эту проблему.Я надеюсь, что кто-то может внести свой вклад, потому что я в растерянности.И эта статья ( Что такое исключение NullPointerException и как я могу его исправить? ), даже если все продолжают рекомендовать его в качестве руководства для «нулевых исключений», мне трудно применить его кмоя ситуация, связанная с webView и настройками, которые я указал в java-скрипте ниже.

Если я удаляю строки webView из действия, страница действия нормально загружается в приложение.Все белое и без содержания конечно, но оно загружается.Как только я добавляю код webView обратно в активность;приложение вылетает, как только оно пытается загрузить.В то время как это, кажется, терпит крах, приложение фактически загружает страницу активности во всем белом и бросает себя к фону устройства, не закрывая, и выскакивает уведомление, заявляющее очевидное, что приложение упало.Он не выходит из приложения, он просто выбрасывает его на задний план и отправляет сообщение об ошибке.Поэтому я считаю, что средство можно найти в обзоре кода, связанного с webView, но я не могу его найти, и ни один из ранее рекомендованных методов не исправил его.И я должен отметить, что это происходит как на моем фактическом подключенном устройстве, так и на эмуляторе Android Studio, поэтому я не верю, что это были настройки телефона или проблема с кешем.

Вот мой LogCat

05-08 14:19:03.423 31797-31797/com.app.sega E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.sega, PID: 31797
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.sega/com.app.sega.sega}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.webkit.WebView.findViewById(int)' on a null object reference

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.webkit.WebView.findViewById(int)' on a null object reference
        at com.app.sega.sega.onCreate(sega.java:18)

Я только что обновил содержимое моих файлов ниже, пытаясь это исправить.Это то, что у меня есть на данный момент.Получаю те же результаты.

Скрипт webView для нового действия в sega.java

package com.app.sega;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

public class sega extends AppCompatActivity {
    private WebView webview_s;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sega);

        webview_s = (WebView)webview_s.findViewById(R.id.webview_sega);
        webview_s.getSettings().getJavaScriptEnabled();
        webview_s.setWebViewClient(new WebViewClient_s());
        webview_s.setInitialScale(1);
        webview_s.getSettings().getBuiltInZoomControls();
        webview_s.getSettings().getUseWideViewPort();

    }

    private class WebViewClient_s extends WebViewClient {

        public boolean shouldOverrideURLLoading (WebView view, String url) {
            if (Uri.parse(url).getHost().equals("www.southeastgeorgiatoday.com")) {
                return false;
            }else {
                Intent intent_sega = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent_sega);
                return true;
            }

        }
    }
}

В строке ничего не видно (sega.java:18), который оставлен пустым / пустым.Это то, что в строке 18:

        webview_s = (WebView)webview_s.findViewById(R.id.webview_sega);

Где находится нулевая запись?Вот XML WebView, расположенный в activity_sega.xml.Вы можете видеть, что я ввел правильный идентификатор WebView в коде Java выше.

        <WebView android:id="@+id/webview_sega"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

1 Ответ

0 голосов
/ 09 мая 2019

Ну, я наконец-то нашел формулу, которая добилась цели Я удалил "webview_s." из этой строки ...

webview_s = (WebView)webview_s.findViewById(R.id.webview_sega);

чтобы стало ...

webview_s = (WebView) findViewById(R.id.webview_sega);

Теперь весь мой java-скрипт для sega-активности выглядит так ...

package com.app.sega;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

public class sega extends AppCompatActivity {
    private WebView webview_s;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sega);

        webview_s = (WebView) findViewById(R.id.webview_sega);
        webview_s.setWebViewClient(new WebViewClient_s());
        webview_s.setInitialScale(1);
        webview_s.getSettings().getJavaScriptEnabled();
        webview_s.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webview_s.getSettings().getBuiltInZoomControls();
        webview_s.getSettings().getUseWideViewPort();
        webview_s.loadUrl("http://www.southeastgeorgiatoday.com");
    }

    private class WebViewClient_s extends WebViewClient {

        public boolean shouldOverrideURLLoading (WebView view, String url) {
            if (Uri.parse(url).getHost().equals("www.southeastgeorgiatoday.com")) {
                return false;
            }else {
                Intent intent_sega = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent_sega);
                return true;
            }
        }
    }
}

мой макет xml для sega выглядит так ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <WebView android:id="@+id/webview_sega"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

и манифест выглядит как ...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.sega">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".facebook" android:parentActivityName=".MainActivity" />
        <activity android:name=".twitter" android:parentActivityName=".MainActivity" />
        <activity android:name=".wyum" android:parentActivityName=".MainActivity" />
        <activity android:name=".wtcq" android:parentActivityName=".MainActivity" />
        <activity android:name=".wvop" android:parentActivityName=".MainActivity" />
        <activity android:name=".sega" android:parentActivityName=".MainActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Мой основной макет активности для кнопки sega ImageView, которая загружает активность sega при нажатии, выглядит как ...

<ImageView
        android:id="@+id/s"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="16dp"
        android:adjustViewBounds="true"
        android:clickable="true"
        android:autoLink="web"
        android:contentDescription="@string/southeast_georgia_today_official_site"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:longClickable="true"
        android:onClick="@android:string/copyUrl"
        android:scaleType="fitXY"
        android:visibility="visible"
        app:layout_constraintBottom_toTopOf="@+id/y"
        app:layout_constraintEnd_toStartOf="@+id/v"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/s"
        tools:visibility="visible" />

Java-скрипт для этого ImageButton в основной деятельности выглядит так ...

        ImageView img_s = (ImageView) findViewById(R.id.s);
        img_s.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent_s = new Intent(MainActivity.this, sega.class);
                startActivity(intent_s);
            }
        });

Теперь мои другие веб-представления настроены таким же образом, и они правильно отображают действия веб-просмотра, но URL-адреса сайта не отображаются в представлении. Я не получаю сообщение об ошибке, потому что приложение показывает активность, просто активность webView не отображает содержимое должным образом. Он отображает URL sega правильно, но ни один из остальных (ссылки на потоковую передачу музыки и стены в Facebook / Twitter). Вопрос по другой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...