0

我是一名初學者,目前我正嘗試使用Google Maps Api V2 +分段+ actionbar進行實驗,但我認爲我在此處打了一堵牆。這個應用程序的purpouse非常簡單,你從一個片段上的edittext或者一個來自操作欄的edittext輸入一個位置,然後當你點擊搜索時,應用程序會在想要的位置顯示一個標記。如果我鍵入搜索並點擊按鈕,我得到以下錯誤:在Google地圖上搜索時發生NullPointer或InflateException

01-10 17:29:06.560: E/AndroidRuntime(17425): FATAL EXCEPTION: main 
01-10 17:29:06.560: E/AndroidRuntime(17425): java.lang.NullPointerException 
01-10 17:29:06.560: E/AndroidRuntime(17425): at alan.android.testMapas.FragOne$1.onClick(FragOne.java:32) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.view.View.performClick(View.java:3574) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.view.View$PerformClick.run(View.java:14293) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.os.Handler.handleCallback(Handler.java:605) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.os.Looper.loop(Looper.java:137) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at android.app.ActivityThread.main(ActivityThread.java:4441) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at java.lang.reflect.Method.invoke(Method.java:511) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
01-10 17:29:06.560: E/AndroidRuntime(17425): at dalvik.system.NativeStart.main(Native Method) 

如果已經被顯示在地圖它只適用,但如果我更改選項卡,回去或再次搜索,我得到一個充氣例外:

01-10 17:32:26.080: E/AndroidRuntime(17681): FATAL EXCEPTION: main 
01-10 17:32:26.080: E/AndroidRuntime(17681): android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at alan.android.testMapas.FragSearch.onCreateView(FragSearch.java:35) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1264) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.os.Handler.handleCallback(Handler.java:605) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.os.Looper.loop(Looper.java:137) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.app.ActivityThread.main(ActivityThread.java:4441) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at java.lang.reflect.Method.invoke(Method.java:511) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at dalvik.system.NativeStart.main(Native Method) 
01-10 17:32:26.080: E/AndroidRuntime(17681): Caused by: java.lang.IllegalArgumentException: Binary XML file line #2: Duplicate id 0x7f040036, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285) 
01-10 17:32:26.080: E/AndroidRuntime(17681): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 
01-10 17:32:26.080: E/AndroidRuntime(17681): ... 18 more 

這裏的主要活動:

public class MainActivity extends SherlockFragmentActivity { 

    public ActionBar bar; 
    private EditText txtsearch; 




    // private 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     bar = getSupportActionBar(); 
     //mTabSeeker=new TabSeeker(bar); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowTitleEnabled(false); 

     Tab tab0 = bar 
       .newTab() 
       .setText("1") 
       .setTabListener(
         new SherlockTabListener<FragOne>(this, "One", 
           FragOne.class)); 
     bar.addTab(tab0); 

     Tab tab1 = bar 
       .newTab() 
       .setText("2") 
       .setTabListener(
         new SherlockTabListener<FragSearch>(this, "Search", 
           FragSearch.class)); 
     bar.addTab(tab1); 


    } 




    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.activity_main, (Menu)menu); 

     View v = (View)menu.findItem(R.id.searchoption).getActionView(); 

     txtsearch = (EditText)v.findViewById(R.id.txt_search); 

     txtsearch.setOnEditorActionListener(new EditText.OnEditorActionListener() { 

      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       // TODO Auto-generated method stub 
       FragSearch fs; 
       bar.setSelectedNavigationItem(1); 

       fs = (FragSearch) getSupportFragmentManager().findFragmentByTag("Search"); 
       fs.locateSearch(txtsearch.getText().toString()); 

       return false; 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 

搜索片段

public class FragSearch extends SherlockFragment{ 

    private CameraUpdate camUpd1; 
    private GoogleMap map; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View view = inflater.inflate(R.layout.fragsearch,container,false); 
     map = ((SupportMapFragment)getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 


     return view; 
    } 

    public void locateSearch(String text){ 
     Geocoder geocoder = new Geocoder(getActivity(),Locale.getDefault()); 
     try { 
      List<Address>list= geocoder.getFromLocationName(text, 1); 
      if(list!=null){ 
      Double lat=(Double) list.get(0).getLatitude(); 
      Double lng=(Double)list.get(0).getLongitude(); 
      LatLng ubicacion = new LatLng(lat,lng); 
      CameraPosition camUpd1=new CameraPosition.Builder().target(ubicacion).zoom(16).build(); 
      CameraUpdate camUpd3 = CameraUpdateFactory.newCameraPosition(camUpd1); 
      map.clear(); 

      map.addMarker(new MarkerOptions().position(new LatLng(lat,lng)).title(text)); 

      map.animateCamera(camUpd3); 
      }else{ 

      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      Toast.makeText(getSherlockActivity(), "Search Error", Toast.LENGTH_SHORT).show(); 
      e.printStackTrace(); 
     } 
    } 
} 

FragOne.java

public class FragOne extends SherlockFragment { 
    private EditText et; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View view = inflater.inflate(R.layout.fragone, container, false); 

     et = (EditText) view.findViewById(R.id.editText1); 
     Button bt = (Button) view.findViewById(R.id.button1); 

     bt.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       FragSearch fb; 
       String text; 
       text = et.getText().toString(); 
       fb = (FragSearch) getSherlockActivity() 
         .getSupportFragmentManager() 
         .findFragmentByTag("Search"); 
       fb.locateSearch(text); 
      } 
     }); 

     return view; 
    } 

} 

fragsearch.xml

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment"/> 

和search.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <EditText 
     style="@style/Theme.Sherlock.Light.Dialog" 
     android:id="@+id/txt_search" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.67" 

     android:inputType="text" /> 

</LinearLayout> 

謝謝大家提前!如果需要我發佈項目中的任何內容,請讓我知道。

編輯:我已經更新了兩個日誌,我想空指針給出,因爲它具有訪問locateSearch方法之前被實例化,所以我覺得我必須找到一種方法,通過文字作爲參數和位置一旦它已經instanciated,但對於InflateExceptioin它看起來像我將不得不尋找另一種方式來膨脹該片段的視圖,因爲該TabListener是我用在其他應用程序沒有關於常規片段的問題。有任何想法嗎?

回答

1

最後我得到了IllegalArgumentException。做了一些研究後,我改變了一下OnCreateView(),並擴展了SupportMapFragment而不是SherlockFragment。下面的代碼:

public class FragSearch extends SupportMapFragment { 

    private GoogleMap map; 

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

     View view = super.onCreateView(inflater, container, savedInstanceState); 
     map = getMap(); 
     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

     return view; 
    } 

    public void locateSearch(String text) { 
     Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault()); 
     try { 
      List<Address> list = geocoder.getFromLocationName(text, 1); 
      if (list != null) { 
       Double lat = (Double) list.get(0).getLatitude(); 
       Double lng = (Double) list.get(0).getLongitude(); 
       LatLng ubicacion = new LatLng(lat, lng); 
       CameraPosition camUpd1 = new CameraPosition.Builder() 
         .target(ubicacion).zoom(16).build(); 
       CameraUpdate camUpd3 = CameraUpdateFactory 
         .newCameraPosition(camUpd1); 
       map.clear(); 

       map.addMarker(new MarkerOptions() 
         .position(new LatLng(lat, lng)).title(text)); 

       map.animateCamera(camUpd3); 
      } else { 

      } 
     } catch (Exception e) { 
      Toast.makeText(getActivity(), "Search Error", Toast.LENGTH_SHORT) 
        .show(); 
      e.printStackTrace(); 
     } 
    } 
} 

對於NPE,似乎它被扔是例外,因爲我試圖訪問方法,此對象實例化之前如此看來,我得設法找到一個解決辦法爲了那個原因。

2
java.lang.NullPointerException 
    at alan.android.testMapas.FragOne$1.onClick(FragOne.java:32) 

關於你的第一套錯誤的,你有你的按鈕的OnClickListener空值。我猜測這是fb,因爲我沒有看到你給了片段的標籤"Prestamo"。但從LogCat狀態開始,第32行。

Caused by: java.lang.IllegalArgumentException: Binary XML file line #2: Duplicate id 0x7f040036, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 

第二組的錯誤,發生,因爲你是你點擊一個標籤,每次創建現有片段的新副本。 (因此重複的id錯誤。)您的TabListener應該重新加載已經存在的碎片。這裏有一個簡單的tutorial來幫忙。

+0

謝謝你回答山姆!至於fragment標籤,看起來我很匆忙,忘記修補該標籤,但無法修復,無論如何,我會嘗試從操作欄edittext中添加錯誤日誌。順便說一句,感謝您的教程! –

+0

好的,我已經使用更正的日誌和類編輯了OP,只有在加載標籤時纔會出現illegalargument,並且必須再次膨脹fragsearch.xml。 –