【问题标题】:IllegalArgumentException: No view found for id , When coming back from another fragment and onResume callsIllegalArgumentException:未找到 id 的视图,当从另一个片段和 onResume 调用返回时
【发布时间】:2015-03-19 15:17:45
【问题描述】:

我有一个片段,它的大部分布局都是以编程方式创建的。

该片段第一次出现时一切正常,但是当我打开另一个片段并按返回按钮时,我得到了 IllegalArgumentException。

请注意,当我按下返回按钮时会发生此问题,当我调用 popBackStack 时一切正常。

有什么建议吗?

代码:

if(mapView != null)
{
    ViewGroup parent = (ViewGroup) mapView.getParent();
    if (parent != null)
    {
        parent.removeView(mapView);
    }
}
try
{
    // Creating view
    mapView = getBaseActivity().getLayoutInflater().inflate(R.layout.property_show_map_section, (ViewGroup) view, false);
}
catch(Exception e)
{

}
((LinearLayout)view.findViewById(R.id.section_container)).addView(mapView);
final SupportMapFragment googleMap = new SupportMapFragment();
getChildFragmentManager().beginTransaction()
    .replace(R.id.map_container, googleMap).commit();

日志猫:

03-19 18:28:40.229: E/AndroidRuntime(6850): FATAL EXCEPTION: main
03-19 18:28:40.229: E/AndroidRuntime(6850): java.lang.IllegalArgumentException: No view found for id 0x7f0b00e4 (com.example.app:id/map_container) for fragment SupportMapFragment{53056b1c #0 id=0x7f0b00e4}
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:939)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1917)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1800)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:957)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1541)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:493)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.os.Handler.handleCallback(Handler.java:730)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.os.Looper.loop(Looper.java:137)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at java.lang.reflect.Method.invokeNative(Native Method)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at java.lang.reflect.Method.invoke(Method.java:525)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-19 18:28:40.229: E/AndroidRuntime(6850):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android google-maps android-fragments


    【解决方案1】:

    您可能希望在第二个活动中覆盖 onBackPressed() 方法。

    如果你在一个片段中,你可以这样做:

    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            switch (keyCode) {
                case KeyEvent.KEYCODE_BACK:
    
                    return true
            }
            return false;
    }
    

    或者,如果您发布的代码在 Activity 中,您可以尝试将 getChildFragmentManager() 更改为 getFragmentManager()getSupportFragmentManager()

    getChildFragmentManager() 更多用于 Fragment,getFragmentManager() 更多用于 Activity。您可以查看this answer了解更多详情。

    【讨论】:

    • 谢谢你的回答,我在片段中使用了上面的代码,所以我无权访问onBackPressed,而且我认为覆盖onBackPressed不是一个好的解决方案。
    • 您发布的代码是从活动中发布的吗?然后你可以将getChildFragmentManager() 更改为getFragmentManager()getSupportFragmentManager()
    • +1 为您的解决方案覆盖后压,但我认为覆盖后退按钮来解决此问题不是一个好的解决方案。感谢您的帮助:)
    • 用 getfragmentManager 替换 getChildFragmentManager 解决了这个问题,即使我现在在片段而不是 Activity 中编码,谢谢 ;)
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多