2014-01-31 194 views
0

我想開始說我知道這個錯誤已經發布了大約2000次,但是在瀏覽頁面和頁面上的同一個問題的人並嘗試所有的修復之後,他們都沒有工作,所以我決定提出一個新問題。我很抱歉,如果有針對我的特定問題的解決方案,我無法找到它。java.lang.NullPointerException谷歌地圖Android API V2

因爲這樣,我相信錯誤是MainActivity.Java的第41行有一個NullPointerException,因爲Google Map是null並且沒有被初始化。

41號線如下:

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapU)).getMap(); 

如果我刪除所有來自MainActivity.Java我的代碼,只留下由Android Studio生成的代碼時,應用程序啓動了罰款,並顯示谷歌地圖世界,所以我不認爲它與我的API密鑰或Google Play服務沒有任何關係。

一些東西,我已經試過是:

從FragmentManager - 切換到SupportFragmentManager在線41(當我做這個,我改變了地圖從FragmentMap到SupportMapFragment)
-Adding權限清單文件,你可以看到我結束的一切。 - 不同設備
-I原本就minSDK 12(在三星Galaxy S2和銀河S4不工作),決定改變到16只,看它是否會有所幫助,沒有什麼

注:我首先創建了這個項目,出於某種原因,MainActivity.Java表示擴展了ActionBarActivity而不是FragmentActivity,所以我將其改爲說FragmentActivity,但我之前和之後都遇到了這個問題。

的Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.hasan.maps" > 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="com.google.android.providers.gsf.permission.MAPS_RECIEVE"></uses-permission> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 


<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true"/> 


<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <activity 
     android:name="com.hasan.maps.MainActivity" 
     android:label="@string/app_name" 
     > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="APIKEY_IS_INSERTED_HERE"/> 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
</application> 

</manifest> 

MainActivity.Java

package com.hasan.maps; 

import android.support.v4.app.FragmentActivity; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.os.Build; 

import com.google.android.gms.maps.CameraUpdate; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 

public class MainActivity extends FragmentActivity { 

private GoogleMap map; 
private final LatLng Location_NJIT = new LatLng(40.7406517, -74.1792757); 
private final LatLng Location_Stevens = new LatLng(40.7469309, -74.0258336); 

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



    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()) 
       .commit(); 

       } 
     map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapU)).getMap(); 


} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, 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) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public void onClick_city (View v){ 

} 
public void onClick_njit (View v){ 
    CameraUpdate update = CameraUpdateFactory.newLatLng(Location_NJIT); 
    map.animateCamera(update); 
} 
public void onClick_stevens (View v){ 

} 


/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

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

} 

logcat的

Logcat 

01-31 00:08:42.050 14353-14353/com.hasan.maps E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hasan.maps/com.hasan.maps.MainActivity}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
     at android.app.ActivityThread.access$700(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4938) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
     at dalvik.system.NativeStart.main(Native Method) 


Caused by: java.lang.NullPointerException 
      at com.hasan.maps.MainActivity.onCreate(MainActivity.java:41) 
      at android.app.Activity.performCreate(Activity.java:5188) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
            at android.app.ActivityThread.access$700(ActivityThread.java:140) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4938) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 

Fragment_Main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="com.hasan.maps.MainActivity$PlaceholderFragment"> 



    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/mapU" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@+id/stevens" /> 

    <Button 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="City" 
     android:id="@+id/city" 
     android:layout_above="@+id/map" 
     android:layout_toRightOf="@+id/header" 
     android:onClick="onClick_city" /> 

    <Button 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="NJIT" 
     android:id="@+id/njit" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/city" 
     android:onClick="onClick_njit" /> 

    <Button 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Stevens" 
     android:id="@+id/stevens" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/njit" 
     android:onClick="onClick_stevens" /> 


</RelativeLayout> 

提前致謝!

+0

MainActivity.java第41行的內容是什麼? –

+0

對不起,我應該指定map =((SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.mapU))。getMap(); – user2828960

回答

1

//其實你已經宣佈frafment ID android:id="@+id/mapU"佈局Fragment_Main.xml

,但你在MainActivity.java與佈局調用activity_main.xml

確保你的聲明地圖片段activity_mail.xml.

或致電

PlaceholderFragment 

map = ((SupportMapFragment) getSupportFragmentManager()rootView.findFragmentById(R.id.mapU)).getMap(); 
+0

在Fragment_Main.xml中,我將它命名爲mapU,因爲我認爲命名我的變量映射並命名碎片映射可能存在問題。 – user2828960

+0

沒有它的片段我能夠顯示地圖當我削減給定的代碼,但是當我嘗試顯示多個位置,然後這個錯誤來臨 –

0

回答:

我終於在把頭髮撕掉幾小時後終於明白了。代碼必須在片段活動類下移動。