findFragmentById总是返回一个空 [英] findFragmentById always returns a null

查看:174
本文介绍了findFragmentById总是返回一个空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用在mainActivity导航模式的动作条。不同的标签有不同的布局,并在其中一个选项卡,我嵌入的布局具有MapFragment内。用下面的code,应用程序运作良好,在mapFragments工作正常,标签工作正常。 但是,一旦我想访问镶嵌着myFragment的mapFragment使用getFragmentManager()。findFragmentById(R.id.map_add),我总是得到空。

我已经使用FragmentManager和FragmentTransaction添加myfragment和MapFragment,但仍获得空从findFragmentById(R.id.map_add)尝试。请帮助...

这样的初始化的MainActivity:

 保护无效的onCreate(束捆){
    super.onCreate(包);
    的setContentView(R.layout.main);

    //动作条被启动
    动作条动作条= getActionBar();
    //告诉我们要使用标签的动作条。
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    //启动选项卡,设置文本给它。
    ActionBar.Tab myTab = actionbar.newTab()的setText(哎)。

    //创建我们要用于显示内容的片段
    片段myFragment =新myFragment();

    //设置选项卡监听器。现在,我们可以听的点击。
    myTab.setTabListener(新MyTabsListener(myFragment));


    //标签添加到动作条
    actionbar.addTab(myTab);
    地图=((MapFragment)getFragmentManager()findFragmentById(R.id.map_add)。)的GetMap(); //线103

}
 

在MainActivity的布局,main.xml中

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人:ID =@ + ID / fragment_container
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:paddingBottom会=@扪/ activity_vertical_margin
机器人:以下属性来=@扪/ activity_horizo​​ntal_margin
机器人:paddingRight =@扪/ activity_horizo​​ntal_margin
机器人:paddingTop =@扪/ activity_vertical_margin
工具:上下文=MainActivity。>
< / RelativeLayout的>
 

在tablistener的code:

 类MyTabsListener实现ActionBar.TabListener {
    公共片段片段;

    公共MyTabsListener(片段片段){
        this.fragment =片段;
    }

    @覆盖
    公共无效onTabReselected(TAB键,FragmentTransaction英尺){

    }

    @覆盖
    公共无效onTabSelected(TAB键,FragmentTransaction英尺){
        ft.replace(R.id.fragment_container,片段);
    }

    @覆盖
    公共无效onTabUnselected(TAB键,FragmentTransaction英尺){
        ft.remove(片段);
    }

}
 

myFragment的code:

 公共静态类AddAlias​​Fragment扩展片段{

    私有静态视图中查看;

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        如果(查看!= NULL){
            ViewGroup中父=(ViewGroup中)view.getParent();
            如果(父!= NULL)
                parent.removeView(视图);
        }
        尝试 {
            鉴于= inflater.inflate(R.layout.myfragment_layout,集装箱,假);
        }赶上(InflateException E){
            / *地图已经存在,只是返回观点,因为它是* /
        }
        返回查看;
    }

    公共MapFragment getMapFragment(){
        返回(MapFragment)getFragmentManager()findFragmentById(R.id.map_add)。
    }

}
 

myFragment的布局:myfragment_layout.xml

 < XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:ID =@ + ID / map_add_layout
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
>
<的EditText
    机器人:ID =@ + ID /搜索
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:提示=@字符串/ searchhint
    />

<按钮
    机器人:ID =@ + ID / searchbtn
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_alignBottom =@ + ID /搜索
    机器人:layout_toRightOf =@ ID /搜索
    机器人:文本=@字符串/去/>

<片段
      机器人:ID =@ + ID / map_add
      机器人:标签=添加
      机器人:layout_width =match_parent
      机器人:layout_height =match_parent
      机器人:layout_below =@ ID /搜索
      机器人:名称=com.google.android.gms.maps.MapFragment/>
 

在logcat的输出:在空指针异常是指线103,这是的GetMap()行,我在前面提到的code后评论

  04-02 21:23:12.122:E / AndroidRuntime(3672):致命异常:主要
04-02 21:23:12.122:E / AndroidRuntime(3672):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.test.test / com.test.test.MainActivity}:显示java.lang.NullPointerException
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread.access $ 600(ActivityThread.java:153)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1247)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.os.Handler.dispatchMessage(Handler.java:99)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.os.Looper.loop(Looper.java:137)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread.main(ActivityThread.java:5226)
04-02 21:23:12.122:E / AndroidRuntime(3672):在java.lang.reflect.Method.invokeNative(本机方法)
04-02 21:23:12.122:E / AndroidRuntime(3672):在java.lang.reflect.Method.invoke(Method.java:511)
04-02 21:23:12.122:E / AndroidRuntime(3672):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:795)
04-02 21:23:12.122:E / AndroidRuntime(3672):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
04-02 21:23:12.122:E / AndroidRuntime(3672):在dalvik.system.NativeStart.main(本机方法)
04-02 21:23:12.122:E / AndroidRuntime(3672):由:显示java.lang.NullPointerException
04-02 21:23:12.122:E / AndroidRuntime(3672):在com.test.test.MainActivity.onCreate(MainActivity.java:103)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.Activity.performCreate(Activity.java:5104)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-02 21:23:12.122:E / AndroidRuntime(3672):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
04-02 21:23:12.122:E / AndroidRuntime(3672):11 ...更多
 

解决方案

这是因为MapFragment尚未完成加载谷歌地图对象。为了解决这个问题试图重写onActivityCreated当你创建地图片段。从您的实现onActivityCreated那么做地图的访问和修改。

  myMapFragment =新SupportMapFragment(){
    @覆盖
    公共无效onActivityCreated(包savedInstanceState){
        //修改你的地图在这里
    }
}
 

I'm using an actionbar in navigation mode in the mainActivity. Different tabs has different layouts, and on one of these tabs, I embed a layout which has a MapFragment inside. With the following code, the app works well, the mapFragments works fine, the tabs works fine. However, once I want to get access the mapFragment embeded in myFragment use getFragmentManager().findFragmentById(R.id.map_add), I always get null.

I've tried using FragmentManager and FragmentTransaction to add myfragment and the MapFragment, but still get null from findFragmentById(R.id.map_add). Please help...

The MainActivity initialized like this:

protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.main);

    // ActionBar gets initiated
    ActionBar actionbar = getActionBar();
    // Tell the ActionBar we want to use Tabs.
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    // initiating the tabs and set text to it.
    ActionBar.Tab myTab = actionbar.newTab().setText("hey");

    // create the fragments we want to use for display content
    Fragment myFragment = new myFragment();

    // set the Tab listener. Now we can listen for clicks.
    myTab.setTabListener(new MyTabsListener(myFragment));


    // add the tabs to the actionbar
    actionbar.addTab(myTab);
    map=((MapFragment)getFragmentManager().findFragmentById(R.id.map_add)).getMap();//line 103

}

the layout of the MainActivity, main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>

the code of the tablistener:

    class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment);           
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(fragment);
    }

}

the code of myFragment:

public static class AddAliasFragment extends Fragment {

    private static View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null)
                parent.removeView(view);
        }
        try {
            view = inflater.inflate(R.layout.myfragment_layout, container, false);
        } catch (InflateException e) {
            /* map is already there, just return view as it is */
        }
        return view;
    }

    public MapFragment getMapFragment(){
        return (MapFragment)getFragmentManager().findFragmentById(R.id.map_add);
    } 

}

the layout of myFragment: myfragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_add_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
    android:id="@+id/search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="@string/searchhint"
    />

<Button
    android:id="@+id/searchbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/search"
    android:layout_toRightOf="@id/search"
    android:text="@string/go" />

<fragment 
      android:id="@+id/map_add"
      android:tag="add"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_below="@id/search"
      android:name="com.google.android.gms.maps.MapFragment"/>

the Logcat output: the nullpointer exception refers to line 103, which is the getMap() line, I have comment after it in the aforementioned code

04-02 21:23:12.122: E/AndroidRuntime(3672): FATAL EXCEPTION: main
04-02 21:23:12.122: E/AndroidRuntime(3672): java.lang.RuntimeException: Unable to start     activity ComponentInfo{com.test.test/com.test.test.MainActivity}:     java.lang.NullPointerException
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread.access$600(ActivityThread.java:153)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.os.Looper.loop(Looper.java:137)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread.main(ActivityThread.java:5226)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at java.lang.reflect.Method.invokeNative(Native Method)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at java.lang.reflect.Method.invoke(Method.java:511)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at dalvik.system.NativeStart.main(Native Method)
04-02 21:23:12.122: E/AndroidRuntime(3672): Caused by: java.lang.NullPointerException
04-02 21:23:12.122: E/AndroidRuntime(3672):     at     com.test.test.MainActivity.onCreate(MainActivity.java:103)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.Activity.performCreate(Activity.java:5104)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-02 21:23:12.122: E/AndroidRuntime(3672):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
04-02 21:23:12.122: E/AndroidRuntime(3672):     ... 11 more

解决方案

This happens because the MapFragment has not finished loading the google map object. To fix this try overriding onActivityCreated when you create the map fragment. From your implementation of onActivityCreated then do all of your map accesses and modifications.

myMapFragment=new SupportMapFragment(){
    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        //modify your map here
    }
}

这篇关于findFragmentById总是返回一个空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆