1

嘗試此操作約3天后,如果沒有運氣,通過幾個線程挖掘,我必須將sos發送給任何能夠善意查看我的代碼的人。 該應用功能完美無缺,直到我翻轉到風景模式。如何防止getChildFragmentManager強制轉換爲SupportMapFragment在景觀模式下崩潰

我正在執行解決方案,正如在下面的線程中所描述的,所以我移動代碼的方式很多,但我遇到了如下錯誤:Nullpointer異常。未找到id爲xxxx的視圖。孩子已經有一位家長。

無論我做什麼,它都會一直崩潰。請參閱我跟着線程,但沒有運氣

thread 1thread 2thread 3thread 4thread 5

我很失望我下載了這個漂亮的應用程序(Airbnb google map),看看他們是如何解決這個問題,但在我翻轉電話它崩潰完全像我的。我可能會給開發者發一封便條。

我在線程閱讀意見是不同的,給出的概念是有趣的,但我不能解決這個問題。將欣賞一些新的代碼行。

代碼

public class MapsActivity extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 
    public static final String LOG_TAG = MapsActivity.class.getSimpleName(); 

    private static final int CURSOR_LOADER_ID = 0; 

    private Cursor initQueryCursor; 
    private GetSet coord; 
    private AppPreferences sPref; 
    private LatLng home; 
    private SupportMapFragment sMap; 
    private FragmentManager fm; 
    private GoogleMap mMap; 

    private static final String FRAGMENT_LISTS = 
       "net.simonvt.schematic.samples.ui.SampleActivity.LISTS"; 


    public MapsActivity() { 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     sPref = new AppPreferences(getActivity()); 

     SyncAdapter.syncImmediately(getActivity(), 
       sPref.getCoordBody("lat"), 
       sPref.getCoordBody("lon")); 
     getLoaderManager().initLoader(CURSOR_LOADER_ID, null, this); 
     // getLoaderManager().restartLoader(CURSOR_LOADER_ID, null, this); 

     // mMapCursor = new MapCursor(getActivity(), null, 0); 


//  ConnectivityManager cm = 
//    (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
//  NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 


//  getLoaderManager().restartLoader(CURSOR_LOADER_ID, null, this); 
    } 


    @Override 
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     if(savedInstanceState==null) { 

      View v = inflater.inflate(R.layout.yelp_google_map, container, false); 
      fm = getChildFragmentManager(); 

      sMap = (SupportMapFragment) fm.findFragmentById(R.id.map); 

      mMap = sMap.getMap(); 

      initQueryCursor = getActivity().getContentResolver().query(QuoteProvider.Quotes.CONTENT_URI, 
        new String[]{QuoteColumns.URL, QuoteColumns.DISPLAY_PHONE, QuoteColumns.RATING_IMG, 
          QuoteColumns.ID_BUSINESS_NAME, QuoteColumns.DISPLAY_ADDRESS, QuoteColumns.POSTAL_CODE, 
          QuoteColumns.LATITUDE, QuoteColumns.LOGITUDE}, null, 
        null, null); 

      LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
      if (initQueryCursor != null) { 

       DatabaseUtils.dumpCursor(initQueryCursor); 
       initQueryCursor.moveToFirst(); 


       for (int i = 0; i < initQueryCursor.getCount(); i++) { 


        home = new LatLng(Double.valueOf(initQueryCursor.getString(initQueryCursor.getColumnIndex("latitude"))), 
          Double.valueOf(initQueryCursor.getString(initQueryCursor.getColumnIndex("longitude")))); 
        Marker m = mMap.addMarker(new MarkerOptions().position(home). 
          title(initQueryCursor.getString(initQueryCursor.getColumnIndex("id_bussines_name")))); 

        initQueryCursor.moveToNext(); 
        builder.include(home); 
       } 
       if (home != null) { 
        mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 215, 210, 0)); 
       } 
       initQueryCursor.close(); 

       mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 

        public void onInfoWindowClick(Marker marker) { 


         Intent intent = new Intent(getContext(), DetailActivity.class); 
         intent.putExtra("title", marker.getTitle()); 
         startActivity(intent); 
        } 

       }); 

      } 

      return v; 
     } 

     return null; 

    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     return new CursorLoader(getActivity(), QuoteProvider.Quotes.CONTENT_URI, 
       new String[]{ QuoteColumns._ID, QuoteColumns.DISPLAY_ADDRESS, QuoteColumns.DISPLAY_PHONE, 
         QuoteColumns.RATING, QuoteColumns.URL, QuoteColumns.POSTAL_CODE, QuoteColumns.ID_BUSINESS_NAME, 
         QuoteColumns.LATITUDE, 
         QuoteColumns.LOGITUDE}, 
       null, 
       null, 
       null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

     if (loader != null) { 
      //  mMapCursor.swapCursor(data); 
      initQueryCursor = data; 
     } 
    } 

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

    } 
} 

佈局

<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" 
       tools:context="mem.edu.joshua.MapsActivity" 
       android:background="#009688"> 
    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 
</RelativeLayout> 

這僅僅是我得到的錯誤之一。根據我改變什麼,我得到一個不同的錯誤,如我上面提到

FATAL EXCEPTION: main 
                   Process: mem.edu.joshua, PID: 21406 
                   java.lang.IllegalArgumentException: No view found for id 0x7f0c0081 (mem.edu.joshua:id/map) for fragment MapsActivity{425ff5b8 #2 id=0x7f0c0081 MapsActivity} 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1098) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) 
                    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) 
                    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671) 
                    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:532) 
                    at android.os.Handler.handleCallback(Handler.java:733) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:146) 
                    at android.app.ActivityThread.main(ActivityThread.java:5692) 
                    at java.lang.reflect.Method.invokeNative(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:515) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
                    at dalvik.system.NativeStart.main(Native Method) 
+0

可能你應該看看這些鏈接。 1)http://wptrafficanalyzer.in/blog/retain-markers-on-screen-rotation-in-google-maps-android-api-v2-using-parcelable-latlng-points/(2)http:// www .androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html(3)http://www.androidtrainee.com/retain-markers-on-screen-rotation-in-google-maps-android -api-v2-using-parcelable-latlng-points/ – Stallion

+0

@Stallion,感謝您的幫助。我看到鏈接(2)很有趣。我有希望在那一個,但我不斷得到。 ** IllegalArgumentException:沒有發現ID爲0x..81的片段。**鏈接(1)類似於鏈接(3)。他們專注於保留標記,我沒有問題,因爲我正在使用SQLite。也鏈接(1)使用FragmentActivity,我沒有,我有一個片段。我的主要是在一個不同的文件中,我添加了這個。 '在連接(3) – Erik

回答

0

採取的android:configChanges

<activity android:name=".yourFragmentactivity" 
     android:label="@string/appname" 
     android:configChanges="orientation|keyboard|keyboardHidden|screenSize" 
     /> 

或採取橫向佈局,佈局土地上採取佈局

+0

建議的主'MapsActivity.TaskCallbacks'中實現之後'if(mTaskFragment == null){..}'將代碼添加到清單並且不起作用。創建了一個新的map_layout.xml(橫向),也沒有工作。清理該項目再試一次,但沒有。我懂了。 IllegalArgumentException:片段MapsActivity未找到id爲0x7f0c0081(mem.edu.joshua:id/map)的視圖。我很感激你回答了我的問題。 – Erik