3

mainActivity의 탐색 모드에서 작업 표시 줄을 사용하고 있습니다. 서로 다른 탭에는 다른 레이아웃이 있으며이 탭 중 하나에 MapFragment가있는 레이아웃을 포함합니다. 다음 코드를 사용하면 앱이 제대로 작동하고 mapFragments가 제대로 작동하며 탭이 정상적으로 작동합니다. 그러나 일단 myFragment에 임베드 된 mapFragment에 액세스하려면 getFragmentManager(). findFragmentById (R.id.map_add)를 사용합니다. 항상 null을 반환합니다.findFragmentById는 항상 null을 반환합니다.

FragmentManager 및 FragmentTransaction을 사용하여 myfragment 및 MapFragment를 추가했지만 findFragmentById (R.id.map_add)에서 Null을 여전히 가져 왔습니다.

는 MainActivity는 다음과 같이 초기화 ... 도와주세요 :

protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.main); 

    // ActionBar gets initiated 
    ActionBar actionbar = getActionBar(); 
    // Tell the ActionBar we want to use Tabs. 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    // initiating the tabs and set text to it. 
    ActionBar.Tab myTab = actionbar.newTab().setText("hey"); 

    // create the fragments we want to use for display content 
    Fragment myFragment = new myFragment(); 

    // set the Tab listener. Now we can listen for clicks. 
    myTab.setTabListener(new MyTabsListener(myFragment)); 


    // add the tabs to the actionbar 
    actionbar.addTab(myTab); 
    map=((MapFragment)getFragmentManager().findFragmentById(R.id.map_add)).getMap();//line 103 

} 

MainActivity의 레이아웃, main.xml에

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

tablistener의 코드 :

class MyTabsListener implements ActionBar.TabListener { 
    public Fragment fragment; 

    public MyTabsListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.replace(R.id.fragment_container, fragment);   
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft.remove(fragment); 
    } 

} 

myFragment의 코드 :

,691,363,210
public static class AddAliasFragment extends Fragment { 

    private static View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if (view != null) { 
      ViewGroup parent = (ViewGroup) view.getParent(); 
      if (parent != null) 
       parent.removeView(view); 
     } 
     try { 
      view = inflater.inflate(R.layout.myfragment_layout, container, false); 
     } catch (InflateException e) { 
      /* map is already there, just return view as it is */ 
     } 
     return view; 
    } 

    public MapFragment getMapFragment(){ 
     return (MapFragment)getFragmentManager().findFragmentById(R.id.map_add); 
    } 

} 

myFragment 레이아웃 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/map_add_layout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<EditText 
    android:id="@+id/search" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:hint="@string/searchhint" 
    /> 

<Button 
    android:id="@+id/searchbtn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/search" 
    android:layout_toRightOf="@id/search" 
    android:text="@string/go" /> 

<fragment 
     android:id="@+id/map_add" 
     android:tag="add" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/search" 
     android:name="com.google.android.gms.maps.MapFragment"/> 

로그 캣 출력 myfragment_layout.xml 다음 nullpointer 예외 (103)를 일렬로 지칭 상기하여 getMap() 라인이고, I는 후 주석에있을 상술 한 코드

04-02 21:23:12.122: E/AndroidRuntime(3672): FATAL EXCEPTION: main 
04-02 21:23:12.122: E/AndroidRuntime(3672): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.test.test/com.test.test.MainActivity}:  java.lang.NullPointerException 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread.access$600(ActivityThread.java:153) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.os.Looper.loop(Looper.java:137) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread.main(ActivityThread.java:5226) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at dalvik.system.NativeStart.main(Native Method) 
04-02 21:23:12.122: E/AndroidRuntime(3672): Caused by: java.lang.NullPointerException 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at  com.test.test.MainActivity.onCreate(MainActivity.java:103) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.Activity.performCreate(Activity.java:5104) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261) 
04-02 21:23:12.122: E/AndroidRuntime(3672):  ... 11 more 
+0

도 logcat 오류를 표시합니다. –

+0

동일한 조각 map_add를 사용하고 있습니다. – Unknown

+0

@LalitPoptani logcat 출력을 업데이트했습니다. – WTH

답변

3

이것은 MapFragment가 Google지도 개체로드를 완료하지 않았기 때문에 발생합니다. 이 문제를 해결하려면지도 조각을 만들 때 onActivityCreated를 재정의하십시오. onActivityCreated를 구현 한 다음 모든지도 액세스 및 수정 작업을 수행하십시오.

myMapFragment=new SupportMapFragment(){ 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     //modify your map here 
    } 
} 
+0

내가 아는 바로는 onActivityCreated는 해당 액티비티가 onCreate()를 수행했다는 사실을 Fragment에 알리는 것이다. 그러나, 나는 활동의 onCreate() 안에 getMap()를 사용하려고합니다. 따라서 Fragment의 onActivityCreated()를 재정의하더라도 여전히 getMap()에 액세스 할 것입니다. – WTH

+0

간단한 테스트를 거친 후 지금 당신이 의미하는 바를 이해합니다. onActivityCreated() 함수에서 getMap()을 사용하여 맵 객체의로드가 완료되었음을 보장해야합니다. 이것은 내 문제를 아주 잘 해결해 준다. 도와 주셔서 대단히 감사합니다. – WTH

+0

네가 의미하는 바는 onCreate 메서드에서 사용할 수 없으므로 onActivityCreated를 사용하여 액세스하기 전에 만들어 졌는지 확인해야한다. 고마워요. 그냥 내 대답에 동의를 클릭하십시오. – chefburns

1

mi에서는 문제가 SupportMapFragment를 지정하지 않았습니다. 내가 가진 은 다음과 같이 사용합니다

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.MapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

으로는 구글 맵 V2 사용을 위해 여기 https://stackoverflow.com/a/16663713/2411379 설명했다.

관련 문제