【问题标题】:NullPointer or InflateException when searching on Google Maps在 Google 地图上搜索时出现 NullPointer 或 InflateException
【发布时间】:2013-01-09 20:42:33
【问题描述】:

我是初学者,目前正在尝试使用 Google Maps Api V2+fragments+actionbar 进行实验,但我想我在这里碰壁了。这个应用程序的目的非常简单,您可以从片段上的编辑文本或操作栏的编辑文本中键入位置,然后当您点击搜索时,应用程序会在所需位置上显示带有标记的地图。如果我输入搜索并点击按钮,我会收到以下错误:

 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 方法之前被实例化,所以我想我必须找到一种方法来通过文本作为参数并在实例化后定位,但至于 InflateExceptioin 看起来我将不得不找到另一种方法来扩展该片段的视图,因为 TabListener 是我在其他应用程序上使用的,没有任何问题常规碎片。有什么想法吗?

【问题讨论】:

    标签: android nullpointerexception google-maps-android-api-2 inflate-exception


    【解决方案1】:
    java.lang.NullPointerException
        at alan.android.testMapas.FragOne$1.onClick(FragOne.java:32)
    

    对于您的第一组错误,您的 Button 的 OnClickListener 中有一个空值。我猜它是fb,因为我看不到你在哪里给任何片段标记"Prestamo"。但从第 32 行开始,如 LogCat 所述。

    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
    

    发生第二组错误是因为您每次单击选项卡时都会创建现有 Fragment 的新副本。 (因此出现重复的 id 错误。)您的 TabListener 应该重新加载已经存在的片段。这是一个简单的tutorial 来提供帮助。

    【讨论】:

    • 感谢您回答山姆!至于片段标签,似乎我太着急了,以至于忘记修补该标签,但这也不能解决问题,无论如何,我将尝试添加带有来自操作栏编辑文本的错误的日志.顺便说一句,感谢您的教程!
    • 好的,我已经用更正的日志和类编辑了 OP,非法参数仅在加载带有地图的选项卡时发生,并且必须第二次膨胀 fragsearch.xml。
    【解决方案2】:

    最后我解决了 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,它似乎抛出了那个异常,因为我试图在实例化该对象之前访问方法,所以看来我必须尝试找到解决方法。

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多