我是一名初學者,目前我正嘗試使用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是我用在其他應用程序沒有關於常規片段的問題。有任何想法嗎?
謝謝你回答山姆!至於fragment標籤,看起來我很匆忙,忘記修補該標籤,但無法修復,無論如何,我會嘗試從操作欄edittext中添加錯誤日誌。順便說一句,感謝您的教程! –
好的,我已經使用更正的日誌和類編輯了OP,只有在加載標籤時纔會出現illegalargument,並且必須再次膨脹fragsearch.xml。 –