从fragment跳转时出错,安卓报空指针异常

绝地辣鸡 2018-04-08 02:56:47
主要的报错内容为:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

这是我的源代码:
SearchFragment.java

package nnu.net.foreginchinese.ui.fragment;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

import nnu.net.foreginchinese.R;
import nnu.net.foreginchinese.common.Login;
import nnu.net.foreginchinese.ui.activity.LiveSimpleToSimple;
import nnu.net.foreginchinese.ui.activity.LoginActivity;
import nnu.net.foreginchinese.ui.activity.MainActivity;
import nnu.net.foreginchinese.ui.base.BaseFragment;

import static android.view.KeyEvent.KEYCODE_BACK;

/**
* A simple {@link Fragment} subclass.
*/
public class SearchFragment extends BaseFragment {
private WebView mWebview = null;
private ProgressBar mProgresssBar = null;

@Override
protected int getLayoutId() {
return R.layout.fragment_search;
}

@Override
public void onInitViews() {
mWebview = (WebView)findViewById(R.id.wv_use);
mProgresssBar = (ProgressBar)findViewById(R.id.pb);
}

// private SharedPreferences sharedPref;
@SuppressLint("JavascriptInterface")
@Override
public void onInitData() {
// sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
//获取bundle里的参数
Bundle bundle=new Bundle();
bundle=getArguments();
String userId_s=bundle.getString("userId");
int userId=Integer.parseInt(userId_s);

WebSettings webSettings = mWebview.getSettings();
webSettings.setAllowFileAccess(true);
webSettings.setAllowContentAccess(true);
mWebview.setWebViewClient(new WebViewClient());
mWebview.getSettings().setJavaScriptEnabled(true);
webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(false); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

//从这里获取用户的userId,get方式传值
//mWebview.loadUrl("http://222.192.6.54/ForeignChinese1.0/htmlContent/course/index.html?userId="+userId);

//设置与JS交互的权限
webSettings.setJavaScriptEnabled(true);
// 通过addJavascriptInterface()将Java对象映射到JS对象
//参数2:Javascript对象名
//参数1:Java对象名
mWebview.addJavascriptInterface(new SearchFragment(),"star");
// 加载JS代码
// 格式规定为:file:///android_asset/文件名.html
mWebview.loadUrl("http://222.192.6.54/ForeignChinese1.0/htmlContent/course/Lesson_t.html?levelId=1&lessonId=1&userId=8");

mWebview.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress==100){
mProgresssBar.setVisibility(View.GONE);
}else{
if(View.INVISIBLE==mProgresssBar.getVisibility()){
mProgresssBar.setVisibility(View.VISIBLE);
}
mProgresssBar.setProgress(newProgress);
}
super.onProgressChanged(view,newProgress);
}
});

}

public final static String LOG_TAG ="LiveSimpleToSimple";
@JavascriptInterface
public void JsToAndroid(){
Log.v("a","js调用安卓成功");
Intent intent=new Intent(getActivity(),LoginActivity.class);
// intent.putExtra(LOG_TAG,"123456789");
startActivity(intent);
// startActivity(new Intent(getActivity(),LiveSimpleToSimple.class));

}

@Override
public void onInitListeners() {

}

@Override
public void onClick(View v) {

}


}


下面是我的报错日志:
04-08 02:43:41.152 3141-3491/nnu.net.foreginchinese V/a: js调用安卓成功
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at android.content.ComponentName.<init>(ComponentName.java:130)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at android.content.Intent.<init>(Intent.java:5780)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at nnu.net.foreginchinese.ui.fragment.SearchFragment.JsToAndroid(SearchFragment.java:103)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:7)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at android.os.Looper.loop(Looper.java:164)
04-08 02:43:41.155 3141-3491/nnu.net.foreginchinese W/System.err: at android.os.HandlerThread.run(HandlerThread.java:65)
04-08 02:43:41.158 3141-3141/nnu.net.foreginchinese I/chromium: [INFO:CONSOLE(209)] "Uncaught Error: Java exception was raised during method invocation", source: http://222.192.6.54/ForeignChinese1.0/htmlContent/course/Lesson_t.html?levelId=1&lessonId=1&userId=8 (209)
...全文
1181 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
younluve 2018-04-09
  • 打赏
  • 举报
回复
不错,Google一下结果
绝地辣鸡 2018-04-09
  • 打赏
  • 举报
回复
谢谢大家的回答,我把下面这行代码放到MainActivity里成功了。 public void JsToAndroid(){ // onAttach(getActivity()); Log.v("a","js调用安卓成功"); Intent intent=new Intent(MainActivity.this,LoginActivity.class); // intent.putExtra(LOG_TAG,"123456789"); startActivity(intent); // startActivity(new Intent(getActivity(),LiveSimpleToSimple.class)); }
sinat_bond 2018-04-09
  • 打赏
  • 举报
回复
你在Mainactivity中设的成员变量 protected Activity mativity;这个没有赋值啊。这个变量是Mainactivity的么?
卡农2020 2018-04-09
  • 打赏
  • 举报
回复
为了下载https--download.csdn.net/download/u010757011/9504796 这本书
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 14 楼 weixin_40084848 的回复:
[quote=引用 13 楼 z979451341 的回复:] 先把这个段代码加进去,然后使用mActivity替换getActivity
兄弟,照着你说的改了一下,这方法我之前在StackOverflow好像也见过,刚刚又试了一下,还是null啊,你看图[/quote] 110行 onAttach(getActivity());这句也注释掉了
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 13 楼 z979451341 的回复:
先把这个段代码加进去,然后使用mActivity替换getActivity

兄弟,照着你说的改了一下,这方法我之前在StackOverflow好像也见过,刚刚又试了一下,还是null啊,你看图
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
先把这个段代码加进去,然后使用mActivity替换getActivity
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 11 楼 z979451341 的回复:
换个方法调用Activity
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mActivity = activity;
}


你在调用了getActivity()时,当前的Fragment已经onDetach() 了宿主Activity。比如:你在pop了Fragment之后,该Fragment的异步任务仍然在执行,并且在执行完成后调用了getActivity()方法,这样就会空指针。
我比较水,不太明白怎么用这种方法。是直接把这段代码加进去吗?还是需要改什么东西?
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
换个方法调用Activity
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mActivity = activity;
}


你在调用了getActivity()时,当前的Fragment已经onDetach() 了宿主Activity。比如:你在pop了Fragment之后,该Fragment的异步任务仍然在执行,并且在执行完成后调用了getActivity()方法,这样就会空指针。
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 5 楼 u013894546 的回复:
JsToAndroid 里面断点,自己看看哪个东西空了 new Intent()的时候要传context,里面会创建一个ComponentName,ComponentName里面会调用 getPackageName ,一看你这getActivity() 就是空的
我刚刚调试了一下,getActivity()确实是空的,日志里面也提示了。可是为什么呢?该怎么解决好呢
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
LoginActivity.java是一个常规的登录界面,没有问题
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 6 楼 z979451341 的回复:
LiveSimpleToSimple的代码贴出来
这个页面是之前注释掉的,暂时不需要跳转。目前正在测试跳转到LoginActivity.java
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
你的代码报错位置贴出来,
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
LiveSimpleToSimple的代码贴出来
Yunc2 2018-04-08
  • 打赏
  • 举报
回复
JsToAndroid 里面断点,自己看看哪个东西空了 new Intent()的时候要传context,里面会创建一个ComponentName,ComponentName里面会调用 getPackageName ,一看你这getActivity() 就是空的
绝地辣鸡 2018-04-08
  • 打赏
  • 举报
回复
引用 3 楼 z979451341 的回复:
[quote=引用 2 楼 u013894546 的回复:] [quote=引用 1 楼 z979451341 的回复:] 别的我不清楚,你这个函数有问题,应该是view.findViewById
    @Override
    public void onInitViews() {
        mWebview = (WebView)findViewById(R.id.wv_use);
        mProgresssBar = (ProgressBar)findViewById(R.id.pb);
    }
那你是没看到 @Override[/quote]把BaseFragment贴出来看看[/quote] BaseFragment.java如下: package nnu.net.foreginchinese.ui.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import nnu.net.foreginchinese.listener.ActivityInit; /** * Created by jsq on 2017/8/27. */ public abstract class BaseFragment extends Fragment implements ActivityInit { protected View mView; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); int id = getLayoutId(); mView = inflater.inflate(id, null); return mView; } protected abstract int getLayoutId(); @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (this instanceof ActivityInit) { ActivityInit iInit = this; iInit.onInitViews(); iInit.onInitData(); iInit.onInitListeners(); } } protected View findViewById(int id) { return null == mView ? null : mView.findViewById(id); } @Override public String toString() { return getClass().getSimpleName(); } }
Yunc2 2018-04-08
  • 打赏
  • 举报
回复
引用 1 楼 z979451341 的回复:
别的我不清楚,你这个函数有问题,应该是view.findViewById
    @Override
    public void onInitViews() {
        mWebview = (WebView)findViewById(R.id.wv_use);
        mProgresssBar = (ProgressBar)findViewById(R.id.pb);
    }
那你是没看到 @Override
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
引用 2 楼 u013894546 的回复:
[quote=引用 1 楼 z979451341 的回复:] 别的我不清楚,你这个函数有问题,应该是view.findViewById
    @Override
    public void onInitViews() {
        mWebview = (WebView)findViewById(R.id.wv_use);
        mProgresssBar = (ProgressBar)findViewById(R.id.pb);
    }
那你是没看到 @Override[/quote]把BaseFragment贴出来看看
键盘舞者113 2018-04-08
  • 打赏
  • 举报
回复
别的我不清楚,你这个函数有问题,应该是view.findViewById
    @Override
    public void onInitViews() {
        mWebview = (WebView)findViewById(R.id.wv_use);
        mProgresssBar = (ProgressBar)findViewById(R.id.pb);
    }

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧