2015-09-26 27 views
0

在片段中,我在RelativeLayout中包含了一個map和一個按鈕。上面的按鈕和它下面的地圖。在片段中插入onClick方法時的Android異常

這是片段活動代碼:

public class Tab2 extends Fragment implements OnMapReadyCallback { 

    private View view; 
    private Context mContext; 

    private double latitud_del_hotel, longitud_del_hotel; 
    private String nombre_del_hotel; 

    private static final String url = "..hidden here.."; 
    private ProgressDialog pDialog; 
    private List<Hotel> hotelList = new ArrayList<Hotel>(); 

    private Button mostrarButton; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.tab_2, container, false); 



     mContext = getActivity(); 

     nombre_del_hotel = getActivity().getIntent().getStringExtra("nombre_hotel"); 
     latitud_del_hotel = getActivity().getIntent().getDoubleExtra("latitud_hotel", 0); 
     longitud_del_hotel = getActivity().getIntent().getDoubleExtra("longitud_hotel",0); 


     FragmentManager manager = getFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     SupportMapFragment fragment = new SupportMapFragment(); 
     transaction.add(R.id.mapView, fragment); 
     transaction.commit(); 

     fragment.getMapAsync(this); 


     mostrarButton = (Button) getActivity().findViewById(R.id.boton_mostrar); 
     mostrarButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       pDialog = new ProgressDialog(getActivity()); 
       pDialog.setMessage("Procesando datos de marcadores..."); 
       pDialog.show(); 

      } 
     }); 

     return view; 
    } 


    @Override 
    public void onMapReady(GoogleMap map) { 
     //map is ready 
     // latitude and longitude 
     double latitude = latitud_del_hotel; 
     double longitude =longitud_del_hotel; 

     // create marker 
     MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(nombre_del_hotel).icon(BitmapDescriptorFactory.fromResource(R.drawable.poi)); 

     // Changing marker icon 
     // marker.icon(BitmapDescriptorFactory 
     // .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

     // adding marker 
     map.addMarker(marker); 
     map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(latitud_del_hotel, longitud_del_hotel)).zoom(15).build(); 
     map.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 
    } 
} 

我需要的是點擊該按鈕,然後在地圖上顯示更多的標記。 因爲它是現在,應用程序在線拋出異常

=>這是線107 mostrarButton.setOnClickListener(新OnClickListener(){

09-26 15:34:08.400 1513年至1513年/ COM。 solinpromex.elpasojuarezexperience

這是異常輸出:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.solinpromex.elpasojuarezexperience, PID: 1513 
    java.lang.NullPointerException 
      at com.solinpromex.elpasojuarezexperience.Tab2.onCreateView(Tab2.java:107) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490) 
      at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1105) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:951) 
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:742) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:607) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:742) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:607) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:742) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:607) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:340) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2332) 
      at android.view.View.measure(View.java:16857) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1334) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1532) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6282) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
      at android.view.Choreographer.doFrame(Choreographer.java:560) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
      at android.os.Handler.handleCallback(Handler.java:808) 
      at android.os.Handler.dispatchMessage(Handler.java:103) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5299) 
      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:825) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
      at dalvik.system.NativeStart.main(Native Method) 

我怎麼能解決這個問題 謝謝

注意:在插入setOnclickListener之前,地圖按預期顯示。

回答

1

此致在該行

mostrarButton =(按鈕)getActivity()findViewById(R.id.boton_mostrar)一點改進。

FragmentonCreateView()方法你不能得到Activity因爲片段不添加到Activity呢。所以在上面你可以得到null參考Button

唯一的方法是從onAttach(Activity activity)(或更新的片段生命週期方法)Fragment方法中的活動初始化您的按鈕。

參見示例代碼:

@Override 
public void onAttach(Activity activity) 
{ 
    super.onAttach(activity); 
    mostrarButton = (Button) getActivity().findViewById(R.id.boton_mostrar); 
} 
+0

謝謝,現在它可以工作。 – mvasco

+0

您好!) – mohax

1

你得到的是錯誤的,因爲mostrarButton是空的,這意味着findViewById沒有在您的活動找到R.id.boton_mostrar

如果R.id.boton_mostrarR.layout.tab_2,那麼你可以使用

mostrarButton = (Button) view.findViewById(R.id.boton_mostrar); 

如果它的確是你的活動的佈局,我建議不要與調用活動,直到onActivityCreated被稱爲交互。從理論上講,活動開始於onAttach,但我發現與活動進行互動是不安全的,直到onActivityCreated

+1

謝謝,但我認爲@mohax答案是第一位的。 – mvasco