0

這裏是detailActivity.java,它從openWeatherAPI收集數據並將數據填充到listView中。當我點擊listView上的項目時,OnCreateOptionsMenu中有NPE。Android中的onCreateOptionsMenu中的NullPointerException FragmentActivity

package com.example.sunshine2; 

import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 

import android.support.v4.app.Fragment; 

import android.support.v4.app.LoaderManager.LoaderCallbacks; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 

import android.support.v4.view.MenuItemCompat; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.ShareActionProvider; 

import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.example.sunshine2.data.WeatherContract.WeatherEntry; 

public class DetailActivity extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detail); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new DetailFragment()).commit(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.detail, 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(); 
    if (id == R.id.action_settings) { 
     startActivity(new Intent(this, SettingsActivity.class)); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class DetailFragment extends Fragment implements 
     LoaderCallbacks<Cursor> { 

    private static final String LOG_TAG = DetailFragment.class 
      .getSimpleName(); 

    private static final String FORECAST_SHARE_HASHTAG = " #SunshineApp"; 

    private ShareActionProvider mShareActionProvider; 
    private String mForecast; 

    private static final int DETAIL_LOADER = 0; 

    private static final String[] FORECAST_COLUMNS = { 
      WeatherEntry.TABLE_NAME + "." + WeatherEntry._ID, 
      WeatherEntry.COLUMN_DATE, WeatherEntry.COLUMN_SHORT_DESC, 
      WeatherEntry.COLUMN_MAX_TEMP, WeatherEntry.COLUMN_MIN_TEMP, }; 

    // these constants correspond to the projection defined above, and must 
    // change if the 
    // projection changes 
    private static final int COL_WEATHER_ID = 0; 
    private static final int COL_WEATHER_DATE = 1; 
    private static final int COL_WEATHER_DESC = 2; 
    private static final int COL_WEATHER_MAX_TEMP = 3; 
    private static final int COL_WEATHER_MIN_TEMP = 4; 

    public DetailFragment() { 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_detail, container, false); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Inflate the menu; this adds items to the action bar if it is 
     // present. 
     inflater.inflate(R.menu.detail_fragment, menu); 

     // Retrieve the share menu item 
     MenuItem menuItem = menu.findItem(R.id.action_share); 

     // Get the provider and hold onto it to set/change the share intent. 
     mShareActionProvider = (ShareActionProvider) MenuItemCompat 
       .getActionProvider(menuItem); 

     // If onLoadFinished happens before this, we can go ahead and set 
     // the share intent now. 
     if (mForecast != null) { 
      mShareActionProvider 
        .setShareIntent(createShareForecastIntent()); 
     } 
    } 

    private Intent createShareForecastIntent() { 
     Intent shareIntent = new Intent(Intent.ACTION_SEND); 
     shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
     shareIntent.setType("text/plain"); 
     shareIntent.putExtra(Intent.EXTRA_TEXT, mForecast 
       + FORECAST_SHARE_HASHTAG); 
     return shareIntent; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     getLoaderManager().initLoader(DETAIL_LOADER, null, this); 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     Log.v(LOG_TAG, "In onCreateLoader"); 
     Intent intent = getActivity().getIntent(); 
     if (intent == null) { 
      return null; 
     } 

     // Now create and return a CursorLoader that will take care of 
     // creating a Cursor for the data being displayed. 
     return new CursorLoader(getActivity(), intent.getData(), 
       FORECAST_COLUMNS, null, null, null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     Log.v(LOG_TAG, "In onLoadFinished"); 
     if (!data.moveToFirst()) { 
      return; 
     } 

     String dateString = Utility.formatDate(data 
       .getLong(COL_WEATHER_DATE)); 

     String weatherDescription = data.getString(COL_WEATHER_DESC); 

     boolean isMetric = Utility.isMetric(getActivity()); 

     String high = Utility.formatTemperature(
       data.getDouble(COL_WEATHER_MAX_TEMP), isMetric); 

     String low = Utility.formatTemperature(
       data.getDouble(COL_WEATHER_MIN_TEMP), isMetric); 

     mForecast = String.format("%s - %s - %s/%s", dateString, 
       weatherDescription, high, low); 

     TextView detailTextView = (TextView) getView().findViewById(
       R.id.detail_text); 
     detailTextView.setText(mForecast); 

     // If onCreateOptionsMenu has already happened, we need to update 
     // the share intent now. 
     if (mShareActionProvider != null) { 
      mShareActionProvider 
        .setShareIntent(createShareForecastIntent()); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
    } 
} 
} 

這裏是logcat的

04-13 01:22:51.916: E/AndroidRuntime(20197): FATAL EXCEPTION: main 
04-13 01:22:51.916: E/AndroidRuntime(20197): Process: com.example.sunshine2,          PID: 20197 
04-13 01:22:51.916: E/AndroidRuntime(20197): java.lang.NullPointerException 
04-13 01:22:51.916: E/AndroidRuntime(20197): at com.example.sunshine2.DetailActivity$DetailFragment.onCreateOptionsMenu(DetailAc tivity.java:117) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:1582) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1967) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:225) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:232) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:146) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:293) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:436) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:803) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.os.Handler.handleCallback(Handler.java:733) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.os.Handler.dispatchMessage(Handler.java:95) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.os.Looper.loop(Looper.java:149) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at android.app.ActivityThread.main(ActivityThread.java:5077) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at java.lang.reflect.Method.invokeNative(Native Method) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at java.lang.reflect.Method.invoke(Method.java:515) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
04-13 01:22:51.916: E/AndroidRuntime(20197): at  dalvik.system.NativeStart.main(Native Method) 

我試着調試代碼,但 - mShareActionProvider給我空,這是我無法弄清楚如何

+0

什麼行有錯誤? –

+0

錯誤發生在xml文件中。我將 android:actionProviderClass更改爲app:actionProviderClass – linthum

回答

0

我想問題是你的XML菜單佈局文件中聲明瞭onClick函數,但是代碼中沒有相應的函數。

相關問題