我的android webview片段应用程序崩溃了,在我添加了一个按钮从一个片段转到另一个片段后,控制台上的错误是:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ahmed.stories, PID: 11846
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.ahmed.stories.MainActivity.setUrl(java.lang.String)' on a null object reference at com.ahmed.stories.Saying$3.onPageStarted(Saying.java:127)
at com.android.webview.chromium.WebViewContentsClientAdapter.onPageStarted(WebViewContentsClientAdapter.java:517)
at org.chromium.android_webview.AwContentsClientCallbackHelper$MyHandler.handleMessage(AwContentsClientCallbackHelper.java:144)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
它说问题是第127行与((MainActivity) getActivity()).setUrl(url);
有关,但是我发现它没有任何问题,我想知道它并试图学习,也许你们可以提供帮助。
MainActivity
package com.ahmed.stories;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.customtabs.CustomTabsIntent;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.NavigationView;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, View.OnClickListener {
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
TextView home_tv, stories, bookmarks, drafts, fakecheck, lost, leaving;
CardView lyt_top_bar;
View toolbar_line;
BottomNavigationView navigation;
BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Home home = new Home();
fragmentTransaction.replace(R.id.fragmentContainer, home, "Home");
fragmentTransaction.commit();
return true;
case R.id.navigation_search:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Search search = new Search();
fragmentTransaction.replace(R.id.fragmentContainer, search, "Home");
fragmentTransaction.commit();
return true;
case R.id.navigation_edit:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Edit edit = new Edit();
fragmentTransaction.replace(R.id.fragmentContainer, edit, "Home");
fragmentTransaction.commit();
return true;
case R.id.navigation_message:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Notification notification = new Notification();
fragmentTransaction.replace(R.id.fragmentContainer, notification, "Home");
fragmentTransaction.commit();
return true;
case R.id.navigation_profile:
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Profile profile = new Profile();
fragmentTransaction.replace(R.id.fragmentContainer, profile, "Home");
fragmentTransaction.commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigation = (BottomNavigationView) findViewById(R.id.navigation);
BottomNavigationViewHelper.disableShiftMode(navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.navigation));
bookmarks = findViewById(R.id.bookmarks);
stories = findViewById(R.id.stories);
home_tv = findViewById(R.id.home_tv);
lyt_top_bar = findViewById(R.id.lyt_top_bar);
toolbar_line = findViewById(R.id.toolbar_line);
stories.setOnClickListener(this);
home_tv.setOnClickListener(this);
bookmarks.setOnClickListener(this);
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Home home = new Home();
fragmentTransaction.replace(R.id.fragmentContainer, home, "Home");
fragmentTransaction.commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main3, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
shareTextUrl();
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
showSystemUI();
if (id == R.id.nav_camera) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Profile profile = new Profile();
fragmentTransaction.replace(R.id.fragmentContainer, profile, "Home");
fragmentTransaction.commit();
// Handle the camera action
} else if (id == R.id.nav_gallery) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Edit edit = new Edit();
fragmentTransaction.replace(R.id.fragmentContainer, edit, "Home");
fragmentTransaction.commit();
} else if (id == R.id.nav_slideshow) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Drafts drafts = new Drafts();
fragmentTransaction.replace(R.id.fragmentContainer, drafts, "Home");
fragmentTransaction.commit();
} else if (id == R.id.nav_manage) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Fakecheck fakecheck = new Fakecheck();
fragmentTransaction.replace(R.id.fragmentContainer, fakecheck, "Home");
fragmentTransaction.commit();
} else if (id == R.id.nav_lost) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Lost lost = new Lost();
fragmentTransaction.replace(R.id.fragmentContainer, lost, "Home");
fragmentTransaction.commit();
} else if (id == R.id.nav_send) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Leaving leaving = new Leaving();
fragmentTransaction.replace(R.id.fragmentContainer, leaving, "Home");
fragmentTransaction.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
private void hideSystemUI() {
lyt_top_bar.setVisibility(View.GONE);
navigation.setVisibility(View.GONE);
toolbar_line.setVisibility(View.GONE);
}
public void showSystemUI() {
lyt_top_bar.setVisibility(View.VISIBLE);
navigation.setVisibility(View.VISIBLE);
toolbar_line.setVisibility(View.VISIBLE);
// View decorView = getWindow().getDecorView();
// decorView.setSystemUiVisibility(
// View.SYSTEM_UI_FLAG_LAYOUT_STABLE
// );
}
@Override
public void onClick(View v) {
showSystemUI();
if (v == home_tv) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Saying saying = new Saying();
fragmentTransaction.replace(R.id.fragmentContainer, saying, "Home");
fragmentTransaction.commit();
saying.hideProgress();
hideSystemUI();
}
if (v == bookmarks) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Bookmarks bookmarks = new Bookmarks();
fragmentTransaction.replace(R.id.fragmentContainer, bookmarks, "Home");
fragmentTransaction.commit();
}
if (v == drafts) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Drafts drafts = new Drafts();
fragmentTransaction.replace(R.id.fragmentContainer, drafts, "Home");
fragmentTransaction.commit();
}
if (v == fakecheck) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Fakecheck fakecheck = new Fakecheck();
fragmentTransaction.replace(R.id.fragmentContainer, fakecheck, "Home");
fragmentTransaction.commit();
}
if (v == lost) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Lost lost = new Lost();
fragmentTransaction.replace(R.id.fragmentContainer, lost, "Home");
fragmentTransaction.commit();
}
if (v == leaving) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Leaving leaving = new Leaving();
fragmentTransaction.replace(R.id.fragmentContainer, leaving, "Home");
fragmentTransaction.commit();
}
if (v == stories) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Trending trending = new Trending();
fragmentTransaction.replace(R.id.fragmentContainer, trending, "Home");
fragmentTransaction.commit();
}
}
String urlOpen="";
public void setUrl(String url){
this.urlOpen = url;
}
public void shareTextUrl(){
Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("text/plain");
share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
// Add data to the intent, the receiving app will decide
// what to do with it.
share.putExtra(Intent.EXTRA_SUBJECT, "Title Of The Post");
share.putExtra(Intent.EXTRA_TEXT, urlOpen);
startActivity(Intent.createChooser(share, "We Only share with the people we care!"));
}
public void goToHome(){
showSystemUI();
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
Home home = new Home();
fragmentTransaction.replace(R.id.fragmentContainer, home, "Home");
fragmentTransaction.commit();
}
}
说片段
package com.ahmed.stories;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import java.io.File;
/**
* Created by ahmed on 21/4/18.
*/
public class Saying extends BaseFragment {
private String postUrl = "https://wewritesay.herokuapp.com";
private ProgressBar progressBar;
WebView home_web;
ImageButton btn_home;
private float m_downX;
//
public Saying() {
// Required empty public constructor
}
@Override
public void hideProgress() {
if (progressBar != null)
progressBar.setVisibility(View.GONE);
}
// https://my-medium-clone.herokuapp.com/top-stories
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
((AppCompatActivity) getActivity()).getSupportActionBar().hide();
}
@Override
public void onStop() {
super.onStop();
((AppCompatActivity) getActivity()).getSupportActionBar().show();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_saying, container, false);
home_web = (WebView) view.findViewById(R.id.home_web);
btn_home = view.findViewById(R.id.btn_home);
btn_home.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((MainActivity) getActivity()).goToHome();
}
});
WebSettings settings = home_web.getSettings();
settings.setJavaScriptEnabled(true);
home_web.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
home_web.getSettings().setAppCacheEnabled(true);
settings.setDomStorageEnabled(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
settings.setUseWideViewPort(true);
settings.setSavePassword(true);
settings.setSaveFormData(true);
settings.setEnableSmoothTransition(true);
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
// home_web.getSettings().setJavaScriptEnabled(true);
home_web.loadUrl(postUrl);
home_web.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && home_web.canGoBack()) {
home_web.goBack();
return true;
}
return false;
}
});
initWebView();
// home_web.setHorizontalScrollBarEnabled(false);
return view;
}
private class MyWebChromeClient extends WebChromeClient {
Context context;
public MyWebChromeClient(Context context) {
super();
this.context = context;
}
}
private void initWebView() {
home_web.setWebChromeClient(new Saying.MyWebChromeClient(getActivity()));
home_web.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
((MainActivity) getActivity()).setUrl(url);
progressBar.setVisibility(View.VISIBLE);
// invalidateOptionsMenu();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
home_web.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
// invalidateOptionsMenu();
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
progressBar.setVisibility(View.GONE);
// invalidateOptionsMenu();
}
});
home_web.clearCache(true);
home_web.clearHistory();
home_web.getSettings().setJavaScriptEnabled(true);
home_web.setHorizontalScrollBarEnabled(false);
home_web.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getPointerCount() > 1) {
//Multi touch detected
return true;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
// save the x
m_downX = event.getX();
}
break;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
// set x so that it doesn't move
event.setLocation(m_downX, event.getY());
}
break;
}
return false;
}
});
}
}
答案 0 :(得分:0)
尝试以下:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
然后防止泄漏:
@Override
public void onDetach() {
super.onDetach();
mContext = null;
}
现在使用MainActivity执行:
((MainActivity)mContext).setUrl(url);