【问题标题】:App crashes when a button is clicked to load a webview单击按钮以加载 web 视图时应用程序崩溃
【发布时间】:2018-11-13 16:02:27
【问题描述】:

我对 Android 编程非常陌生,我正在尝试开发一个基本上有四个按钮的小应用程序。假设其中一个按钮在单击时将用户带到网站上的登录页面(在 android 应用程序中)。

我不知道我做错了什么,但是当单击按钮(登录)时,应用程序崩溃了。以下是我的代码

主要活动 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/back"
android:orientation="vertical"
tools:context=".MainActivity">


<Button
    android:id="@+id/login"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:layout_margin="0dp"
    android:alpha="0.6"
    android:background="@drawable/my_button_bg"
    android:drawableLeft="@drawable/ic_lock_open_black_24dp"
    android:drawablePadding="5dp"
    android:onClick="login"
    android:padding="15dp"
    android:paddingLeft="50dp"
    android:paddingRight="20dp"
    android:text="@string/text_login"
    android:textAlignment="textStart"
    android:textAllCaps="false"
    android:textColor="@color/colorOrange"
    android:textSize="20sp"
    android:textStyle="bold"
    />
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_margin="0dp"
    android:layout_gravity="start"
    android:textStyle="bold"
    android:textAllCaps="false"
    android:padding="15dp"
    android:textSize="20sp"
    android:textAlignment="textStart"
    android:text="@string/text_howto"
    android:id="@+id/howto"
    android:alpha="0.6"
    android:drawablePadding="5dp"
    android:paddingLeft="50dp"
    android:paddingRight="20dp"
    android:background="@drawable/my_button_bg"
    android:textColor="@color/colorOrange"
    android:drawableLeft="@drawable/ic_live_help_black_24dp"

    />

主要活动 JAVA

package com.example.hp.fruitprint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends AppCompatActivity {

private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void login(View v)  {
    webView = (WebView)findViewById(R.id.home);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.loadUrl("https://mysitename.com/login");
    webView.setWebViewClient(new WebViewClient());

 }

}

应用程序(活动)XML

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



<WebView
    android:id="@+id/home"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp"/>


</LinearLayout>

清单 XML

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hp.fruitprint">
<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_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <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>

我知道我做的不对,但我对 Android 编程非常陌生(三天前开始)。如果您发现任何我在代码中做得不对的地方,请也请。

【问题讨论】:

标签: android webview


【解决方案1】:

只是为了澄清大家的答案。

Findviewbyid 只能找到属于它自己的子视图。

当活动调用时,将使用您的 xml 的根视图。

这是您的应用程序崩溃,因为 findviewbyid 返回 null 因此在您的 webview 上调用的任何方法都会导致应用程序崩溃

【讨论】:

    【解决方案2】:

    在这里查看

         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            }
    
            public void login(View v)  {
                webView = (WebView)findViewById(R.id.home);
        }
    }
    

    您正在从 setContentView(R.layout.activity_main); 查找视图,并且在 activity_main.xml 中没有任何 webview,因此它显示您 Null Pointer exception。它无法从不同的布局中找到视图。在activity_main.xml 中使用您的网络视图

    如果您想为每个活动设置不同的活动,请尝试

     public class MainActivity extends AppCompatActivity {
    
         private WebView webView;
         @Override
         protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
         }
        public void login(View v)  {
    
                startActivity(new Intent(MainActivity.this, YourWebViewActivity.class));
             }
    
            }
    

    还有你想要使用你的 webView 的活动

    public class YourWebViewActivity extends AppCompatActivity {
    
     private WebView webView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_webview_layout);
    
                webView = (WebView)findViewById(R.id.home);
    
      WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    
        webView.loadUrl("https://www.google.com");
        webView.setWebViewClient(new WebViewClient());
     }
    

    并为 webView 创建一个新活动

    希望您的问题得到解决

    【讨论】:

    • 你是说我应该把 webview 移到 main_activity.xml 中吗?
    • 如果是这样,当视图像您所说的那样放置在主要活动中并单击按钮时,页面会在按钮下方加载,但我希望将页面加载到新的整个页面上
    • 检查我的答案,我根据您的要求更新了它。
    【解决方案3】:

    你必须在activity_main.xml中获取webview

    检查一下:

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    
    
    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_margin="0dp"
        android:alpha="0.6"
    
        android:drawablePadding="5dp"
        android:onClick="login"
        android:padding="15dp"
        android:paddingLeft="50dp"
        android:paddingRight="20dp"
    
        android:textAlignment="textStart"
        android:textAllCaps="false"
    
        android:textSize="20sp"
        android:textStyle="bold"
        />
       <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_gravity="start"
        android:textStyle="bold"
        android:textAllCaps="false"
        android:padding="15dp"
        android:textSize="20sp"
        android:textAlignment="textStart"
        android:text="Hello"
        android:id="@+id/howto"
        android:alpha="0.6"
        android:drawablePadding="5dp"
        android:paddingLeft="50dp"
        android:paddingRight="20dp"
    
        />
       <WebView
        android:id="@+id/home"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp"/>
      </LinearLayout>
    

    MainActivity.java

      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle; 
      import android.view.View;
      import android.webkit.WebSettings;
      import android.webkit.WebView;
     import android.webkit.WebViewClient;
    
    
     public class MainActivity extends AppCompatActivity {
    
     private WebView webView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                webView = (WebView)findViewById(R.id.home);
     }
    
     public void login(View v)  {
    
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    
        webView.loadUrl("https://www.google.com");
        webView.setWebViewClient(new WebViewClient());
    
     }
    
    }
    

    `

    Here is the result

    【讨论】:

    • 我想要一个全新的完整页面上的目标页面
    • 那个是Main Activity和activity_main.xml的完整代码
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多