android应用程序中导航抽屉上的空指针异常
我将遵循本教程: 当应用程序启动时,我得到: java.lang.RuntimeException:无法启动活动组件信息{pakage/pakage.MainActivity}:java.lang.NullPointerException ... 原因:java.lang.NullPointerException 位于pakage.MainActivity.onPostCreate(MainActivity.java:138) 第138行标有注释//第138行 守则:android应用程序中导航抽屉上的空指针异常,android,drawer,Android,Drawer,我将遵循本教程: 当应用程序启动时,我得到: java.lang.RuntimeException:无法启动活动组件信息{pakage/pakage.MainActivity}:java.lang.NullPointerException ... 原因:java.lang.NullPointerException 位于pakage.MainActivity.onPostCreate(MainActivity.java:138) 第138行标有注释//第138行 守则: package net.
package net.udazz.udazz;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView mDrawerList;
RelativeLayout mDrawerPane;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
ArrayList<NavItem> mNavItems = new ArrayList<NavItem>();
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavItems.add(new NavItem("Home", "Meetup destination", R.mipmap.ic_action_home));
mNavItems.add(new NavItem("Preferences", "Change your preferences", R.mipmap.ic_action_settings));
mNavItems.add(new NavItem("About", "Get to know about us", R.mipmap.ic_action_about));
// DrawerLayout
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
// Populate the Navigtion Drawer with options
mDrawerPane = (RelativeLayout) findViewById(R.id.drawerPane);
mDrawerList = (ListView) findViewById(R.id.navList);
DrawerListAdapter adapter = new DrawerListAdapter(this, mNavItems);
mDrawerList.setAdapter(adapter);
// Drawer Item click listeners
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItemFromDrawer(position);
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
// Enable Javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.loadUrl("http://page/");
// Stop local links and redirects from opening in browser instead of WebView
mWebView.setWebViewClient(new MyAppWebViewClient());
}
@Override
public void onBackPressed() {
if(mWebView.canGoBack()) {
mWebView.goBack();
} 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.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle
// If it returns true, then it has handled
// the nav drawer indicator touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// 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) {
return true;
}
return super.onOptionsItemSelected(item);
}
/*
* Called when a particular item from the navigation drawer
* is selected.
* */
private void selectItemFromDrawer(int position) {
Fragment fragment = new PreferencesFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.mainContent, fragment)
.commit();
mDrawerList.setItemChecked(position, true);
setTitle(mNavItems.get(position).mTitle);
// Close the drawer
mDrawerLayout.closeDrawer(mDrawerPane);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState(); // line 138
}
}
class NavItem {
String mTitle;
String mSubtitle;
int mIcon;
public NavItem(String title, String subtitle, int icon) {
mTitle = title;
mSubtitle = subtitle;
mIcon = icon;
}
}
class DrawerListAdapter extends BaseAdapter {
Context mContext;
ArrayList<NavItem> mNavItems;
public DrawerListAdapter(Context context, ArrayList<NavItem> navItems) {
mContext = context;
mNavItems = navItems;
}
@Override
public int getCount() {
return mNavItems.size();
}
@Override
public Object getItem(int position) {
return mNavItems.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.drawer_item, null);
}
else {
view = convertView;
}
TextView titleView = (TextView) view.findViewById(R.id.title);
TextView subtitleView = (TextView) view.findViewById(R.id.subTitle);
ImageView iconView = (ImageView) view.findViewById(R.id.icon);
titleView.setText(mNavItems.get(position).mTitle);
subtitleView.setText(mNavItems.get(position).mSubtitle);
iconView.setImageResource(mNavItems.get(position).mIcon);
return view;
}
}
package net.udazz.udazz;
导入android.app.Fragment;
导入android.app.FragmentManager;
导入android.content.Context;
导入android.os.Bundle;
导入android.support.v4.widget.DrawerLayout;
导入android.support.v7.app.ActionBarDrawerToggle;
导入android.support.v7.app.AppActivity;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入android.webkit.WebSettings;
导入android.webkit.WebView;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类MainActivity扩展了AppCompatActivity{
ListView mDrawerList;
相对分子量;
私有操作bardrawertoggle mDrawerToggle;
私人抽屉布局mDrawerLayout;
ArrayList mNavItems=新的ArrayList();
私有网络视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavItems.add(新的导航项(“主页”、“会议目的地”、R.mipmap.ic_action_Home));
添加(新导航项(“首选项”,“更改首选项”,R.mipmap.ic_action_设置));
mNavItems.add(新NavItem(“关于”,“了解我们”,R.mipmap.ic_action_About));
//抽屉布局
mDrawerLayout=(抽屉布局)findViewById(R.id.DroperLayout);
//使用选项填充导航抽屉
mDrawerPane=(相对长度)findviewbyd(R.id.drawerPane);
mDrawerList=(ListView)findViewById(R.id.navList);
抽屉式适配器=新抽屉式适配器(此为mNavItems);
mDrawerList.setAdapter(适配器);
//抽屉项单击侦听器
mDrawerList.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
从抽屉中选择项目(位置);
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mWebView=(WebView)findViewById(R.id.activity\u main\u WebView);
//启用Javascript
WebSettings WebSettings=mWebView.getSettings();
setJavaScriptEnabled(true);
mWebView.setOverScrollMode(WebView.OVER\u SCROLL\u NEVER);
mWebView.getSettings().SetLoadWithOverview模式(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.loadUrl(“http://page/");
//停止在浏览器而不是WebView中打开本地链接和重定向
setWebViewClient(新的MyAppWebViewClient());
}
@凌驾
public void onBackPressed(){
if(mWebView.canGoBack()){
mWebView.goBack();
}否则{
super.onBackPressed();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//将事件传递给ActionBarDrawerToggle
//如果返回true,则它已处理
//导航抽屉指示灯触摸事件
如果(MDRAWERTOGLE.onOptionsItemSelected(项目)){
返回true;
}
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/*
*从导航抽屉中删除特定项时调用
*被选中。
* */
private void selectItemFromDrawer(整数位置){
Fragment Fragment=新的首选项Fragment();
FragmentManager FragmentManager=getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.mainContent,片段)
.commit();
mDrawerList.setItemChecked(位置,true);
setTitle(mNavItems.get(position.mTitle);
//关上抽屉
mDrawerLayout.衣柜抽屉(mDrawerPane);
}
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();//第138行
}
}
类导航项{
字符串mTitle;
字符串mSubtitle;
int-mIcon;
公共导航项(字符串标题、字符串字幕、int图标){
mTitle=标题;
mSubtitle=副标题;
mIcon=图标;
}
}
类DroperListAdapter扩展BaseAdapter{
语境;
ArrayList mNavItems;
公共抽屉列表适配器(上下文、ArrayList navItems){
mContext=上下文;
mNavItems=navItems;
}
@凌驾
public int getCount(){
返回mNavItems.size();
}
@凌驾
公共对象getItem(int位置){
返回mNavItems.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图;
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
}
};
> this The Activity hosting the drawer
> mDrawerLayout The DrawerLayout to link to the given Activity's ActionBar
> R.string.drawer_open A String resource to describe the "open drawer" action for accessibility
> R.string.drawer_close A String resource to describe the "close drawer" action for accessibility