2013-07-08 42 views
5

Tôi đang sử dụng DrawerLayout và khi tôi tải lần thứ hai một đoạn bản đồ google, ngoại lệ sẽ bị bắt như mong đợi; tuy nhiên, tiếp tục trong cùng một phương thức khi tôi thửCon trỏ rỗng trên chế độ xem được tăng tốc khi tải lần thứ hai một mảnh bản đồ google

Button btnShowList = (Button) ui.findViewById(R.id.btnShowList); 

và tôi nhận được ngoại lệ con trỏ null. Tôi đoán đó là bởi vì ui không được gán bất kỳ giá trị nào.

Tôi có thể giải quyết vấn đề này bằng cách nào?

Page2.java:

public class Page2 extends Fragment { 

    View ui; 
    final String TAG = "POPE"; 
    final int CODIGO_DE_RESULTADO_1 = 1; // Es para usarlo en onActivityResult(); 

    private GoogleMap mMap; 

    public Page2(){ 
     // Este es el constructor 
    } 

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

     if (ui != null) { 
      ViewGroup parent = (ViewGroup) ui.getParent(); 
      if (parent != null){ 
       parent.removeView(ui); 
      } 
     } 

     try { 
      ui = inflater.inflate(R.layout.activity_page2,container,false); 
     } catch (InflateException e) { 
      Log.i(TAG,"HERE COMES THE STACK TRACE"); 
      e.printStackTrace(); 
     } 

     FragmentManager fm = getFragmentManager(); 
     mMap = ((MapFragment) fm.findFragmentById(R.id.map)).getMap(); 
     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);  
     mMap.setMyLocationEnabled(true); 


     Button btnShowList = (Button) ui.findViewById(R.id.btnShowList); 
     btnShowList.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       showFileslist(); 
      } 
     }); 

     return ui; 

    } 
} 

activity_page2.xml:

<RelativeLayout 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<fragment 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.MapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<Button 
    android:id="@+id/btnShowList" 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="Load points" /> 

Log:

07-08 22:17:44.203: I/POPE(11859): HERE COMES THE STACK TRACE 
07-08 22:17:44.213: W/System.err(11859): android.view.InflateException: Binary XML file line #6: Error inflating class fragment 
07-08 22:17:44.213: W/System.err(11859): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 
07-08 22:17:44.213: W/System.err(11859): at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 
07-08 22:17:44.213: W/System.err(11859): at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
07-08 22:17:44.213: W/System.err(11859): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
07-08 22:17:44.213: W/System.err(11859): at com.jorgeandresserrano.gpstools.Page2.onCreateView(Page2.java:52) 
07-08 22:17:44.213: W/System.err(11859): at android.app.Fragment.performCreateView(Fragment.java:1695) 
07-08 22:17:44.213: W/System.err(11859): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:903) 
07-08 22:17:44.213: W/System.err(11859): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075) 
07-08 22:17:44.213: W/System.err(11859): at android.app.BackStackRecord.run(BackStackRecord.java:682) 
07-08 22:17:44.213: W/System.err(11859): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455) 
07-08 22:17:44.223: W/System.err(11859): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 
07-08 22:17:44.223: W/System.err(11859): at android.os.Handler.handleCallback(Handler.java:725) 
07-08 22:17:44.223: W/System.err(11859): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-08 22:17:44.223: W/System.err(11859): at android.os.Looper.loop(Looper.java:137) 
07-08 22:17:44.223: W/System.err(11859): at android.app.ActivityThread.main(ActivityThread.java:5293) 
07-08 22:17:44.223: W/System.err(11859): at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 22:17:44.223: W/System.err(11859): at java.lang.reflect.Method.invoke(Method.java:511) 
07-08 22:17:44.223: W/System.err(11859): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
07-08 22:17:44.223: W/System.err(11859): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
07-08 22:17:44.223: W/System.err(11859): at dalvik.system.NativeStart.main(Native Method) 
07-08 22:17:44.223: W/System.err(11859): Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f05003f, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment 
07-08 22:17:44.223: W/System.err(11859): at android.app.Activity.onCreateView(Activity.java:4863) 
07-08 22:17:44.233: W/System.err(11859): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686) 
07-08 22:17:44.233: W/System.err(11859): ... 19 more 
07-08 22:17:44.233: D/AndroidRuntime(11859): Shutting down VM 
07-08 22:17:44.233: W/dalvikvm(11859): threadid=1: thread exiting with uncaught exception (group=0x410feac8) 
07-08 22:17:44.233: E/AndroidRuntime(11859): FATAL EXCEPTION: main 
07-08 22:17:44.233: E/AndroidRuntime(11859): java.lang.NullPointerException 
07-08 22:17:44.233: E/AndroidRuntime(11859): at com.myname.myapp.Page2.onCreateView(Page2.java:66) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.Fragment.performCreateView(Fragment.java:1695) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:903) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.BackStackRecord.run(BackStackRecord.java:682) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.os.Handler.handleCallback(Handler.java:725) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.os.Looper.loop(Looper.java:137) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at android.app.ActivityThread.main(ActivityThread.java:5293) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at java.lang.reflect.Method.invoke(Method.java:511) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
07-08 22:17:44.233: E/AndroidRuntime(11859): at dalvik.system.NativeStart.main(Native Method) 

Dòng 66 là:

Button btnShowList = (Button) ui.findViewById(R.id.btnShowList); 
+2

đăng stacktrace. – Raghunandan

Trả lời

23

Sự cố có thể được giải quyết bằng cách xóa đoạn bản đồ trong phương thức onDestroyView() ngay trước khi rời khỏi. Như thế này:

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    if (f != null){ 
     getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
} 

bài này giải thích này chi tiết hơn https://stackoverflow.com/a/14484640/2422833

+2

Làm việc như một sự quyến rũ- Cảm ơn –

+0

giải pháp tốt nhất ...;) – user1497577

0

Làm thế nào về việc sử dụng OnResume cho mảnh của bạn. Thực hiện một tham chiếu đến ui của bạn. Và OnResume kiểm tra một lần nữa rằng đối tượng ui là null hoặc không, sau đó thổi phồng nó một lần nữa. Kể từ khi nó được gọi là lần thứ 2 có khả năng rằng nó không đi qua onCreateView của bạn một lần nữa.

+0

onCreateView() được gọi đầu tiên trên onResume(), do đó, lỗi xảy ra trước khi onResume() có bất kỳ cơ hội tương tác nào. Nhân tiện, tôi đang sử dụng DrawerLayout – Jorge

+0

Thông thường, onCreateView đầu tiên được gọi. Sau đó nếu Fragment không bị phá hủy thì khi nó được gọi là onCreateView lần thứ 2 sẽ không được kích hoạt nữa (vì View đã được tăng lên). Chỉ rối tung xung quanh như phát hành tất cả Xem tài liệu tham khảo Bật hoặc tiếp tục tất cả Xem bởi OnResume. Theo quan điểm của tôi thì nó thật kỳ lạ khi OnCreateView được gọi là lần thứ 2 nếu Fragment bị thổi phồng và bạn đã không loại bỏ Hoạt động có nội dung phân mảnh khi kết thúc() –

+0

Tôi nghĩ nó phải liên quan đến việc quản lý đoạn nhưng không thực sự chắc chắn những gì đang xảy ra. Nó tiếp tục gọi onCreateView(). Có lẽ cách phân mảnh được xử lý bởi DrawerLayout? – Jorge

Các vấn đề liên quan