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