添加地图到Android TAB - 错误 [英] Adding Map to Android TAB - Error

查看:288
本文介绍了添加地图到Android TAB - 错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个应用程序,我有3个选项卡,并在最后一个我添加了一个地图,这里是错误的,因为我得到一个错误的标签导航。

以低于code看看

标签片段:

 公共类TAB3扩展片段{    @覆盖
    公共查看onCreateView(LayoutInflater吹气,@Nullable的ViewGroup容器,@Nullable捆绑savedInstanceState){
        视图V = inflater.inflate(R.layout.tab_3,集装箱,FALSE);
        返回伏;
    }
}

XML:

 <?XML版本=1.0编码=UTF-8&GT?;<的RelativeLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent>    <的FrameLayout
        机器人:ID =@ + ID / mapFrame
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent>        <片段
            机器人:ID =@ + ID /图
            机器人:名字=com.google.android.gms.maps.MapFragment
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent/>    < /&的FrameLayout GT;
< / RelativeLayout的>

错误:

  E / AndroidRuntime:致命异常:主要
                                                                    工艺:gon250.dublinbikes,PID:22233
                                                                    android.view.InflateException:二进制XML文件行#12:错误充气类片段
                                                                        在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
                                                                        在android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
                                                                        在android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
                                                                        在android.view.LayoutInflater.inflate(LayoutInflater.java:511)
                                                                        在android.view.LayoutInflater.inflate(LayoutInflater.java:415)
                                                                        在tabs.Tab3.onCreateView(Tab3.java:32)
                                                                        在android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                        在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                        在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                        在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
                                                                        在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
                                                                        在android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
                                                                        在android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
                                                                        在android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
                                                                        在android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
                                                                        在customwidget.SlidingTabLayout $ TabClickListener.onClick(SlidingTabLayout.java:287)
                                                                        在android.view.View.performClick(View.java:5254)
                                                                        在android.widget.TextView.performClick(TextView.java:10530)
                                                                        在android.view.View $ PerformClick.run(View.java:21203)
                                                                        在android.os.Handler.handleCallback(Handler.java:739)
                                                                        在android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        在android.os.Looper.loop(Looper.java:145)
                                                                        在android.app.ActivityThread.main(ActivityThread.java:6872)
                                                                        在java.lang.reflect.Method.invoke(本机方法)
                                                                        在java.lang.reflect.Method.invoke(Method.java:372)
                                                                        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                                                                     java.lang.IllegalArgumentException异常:二进制XML文件行#12:重复ID 0x7f0d0093,标记为空,或父母身份证0x7f0d0096与com.google.android.gms.maps.MapFragment另一片段所致
                                                                        在android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2135)
                                                                        在android.app.Activity.onCreateView(Activity.java:5801)
                                                                        在android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34)
                                                                        在android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
                                                                        在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740)
                                                                        在android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
                                                                        在android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
                                                                        在android.view.LayoutInflater.inflate(LayoutInflater.java:511)
                                                                        在android.view.LayoutInflater.inflate(LayoutInflater.java:415)
                                                                        在tabs.Tab3.onCreateView(Tab3.java:32)
                                                                        在android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                        在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                        在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                        在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
                                                                        在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
                                                                        在android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
                                                                        在android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
                                                                        在android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
                                                                        在android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
                                                                        在customwidget.SlidingTabLayout $ TabClickListener.onClick(SlidingTabLayout.java:287)
                                                                        在android.view.View.performClick(View.java:5254)
                                                                        在android.widget.TextView.performClick(TextView.java:10530)
                                                                        在android.view.View $ PerformClick.run(View.java:21203)
                                                                        在android.os.Handler.handleCallback(Handler.java:739)
                                                                        在android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        在android.os.Looper.loop(Looper.java:145)
                                                                        在android.app.ActivityThread.main(ActivityThread.java:6872)
                                                                        在java.lang.reflect.Method.invoke(本机方法)
                                                                        在java.lang.reflect.Method.invoke(Method.java:372)
                                                                        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

类是在哪里正在添加的错误:

 公共类SlidingTabLayout扩展Horizo​​ntalScrollView {
    / **
     *允许在该选项卡的布局绘制的颜色完全控制。与设置
     * {@link #setCustomTabColorizer(TabColorizer)}。
     * /
    公共接口TabColorizer {        / **
         返回:返回当选择{@ code位置}用指示剂的颜色。
         * /
        INT getIndicatorColor(INT位置);    }    私有静态最终诠释TITLE_OFFSET_DIPS = 24;
    私有静态最终诠释TAB_VIEW_PADDING_DIPS = 16;
    私有静态最终诠释TAB_VIEW_TEXT_SIZE_SP = 12;    私人诠释mTitleOffset;    私人诠释mTabViewLayoutId;
    私人诠释mTabViewTextViewId;
    私人布尔mD​​istributeEvenly;    私人ViewPager mViewPager;
    私人SparseArray<串GT; mContentDescriptions =新SparseArray<串GT;();
    私人ViewPager.OnPageChangeListener mViewPagerPageChangeListener;    私人最终SlidingTabStrip mTab​​Strip;    公共SlidingTabLayout(上下文的背景下){
        这(背景下,NULL);
    }    公共SlidingTabLayout(上下文的背景下,ATTRS的AttributeSet){
        这(背景下,ATTRS,0);
    }    公共SlidingTabLayout(上下文的背景下,ATTRS的AttributeSet,诠释defStyle){
        超(背景下,ATTRS,defStyle);        //禁用滚动条
        setHorizo​​ntalScrollBarEnabled(假);
        //确保标签条填补了这一观
        setFillViewport(真);        mTitleOffset =(int)的(TITLE_OFFSET_DIPS * getResources()getDisplayMetrics()密度。);        mTabStrip =新SlidingTabStrip(背景);
        addView(mTabStrip,LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
    }    / **
     *设置为使用{@link TabColorizer}自定义。
     *
     *如果您只需要简单的custmisation那么你可以使用
     * {@link #setSelectedIndicatorColors(INT ...)}实现
     *同样的效果。
     * /
    公共无效setCustomTabColorizer(TabColorizer tabColorizer){
        mTabStrip.setCustomTabColorizer(tabColorizer);
    }    公共无效setDistributeEvenly(布尔distributeEvenly){
        mDistributeEvenly = distributeEvenly;
    }    / **
     *设置用于指示所选选项卡的颜色。这些颜色被视为一个
     *圆阵。提供了一种颜色将意味着所有标签都用相同的颜色显示。
     * /
    公共无效setSelectedIndicatorColors(INT ...颜色){
        mTabStrip.setSelectedIndicatorColors(颜色);
    }    / **
     *设置{@link ViewPager.OnPageChangeListener}。当使用{@link SlidingTabLayout}你
     *必须通过这个方法来设置任何{@link ViewPager.OnPageChangeListener}。这是如此
     *该布局可以更新它的正确滚动位置。
     *
     * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)
     * /
    公共无效setOnPageChangeListener(ViewPager.OnPageChangeListener监听){
        mViewPagerPageChangeListener =侦听器;
    }    / **
     *设置为被夸大的标签视图的自定义布局。
     *
     * @参数layoutResId布局ID被夸大
     *而{@link的TextView} @参数textViewId ID在膨胀视图
     * /
    公共无效setCustomTabView(INT layoutResId,诠释textViewId){
        mTabViewLayoutId = layoutResId;
        mTabViewTextViewId = textViewId;
    }    / **
     *设置相关的观点寻呼机。需要注意的是这里的假设是,该寻呼机内容
     *(选项卡和选项卡标题的数量)这一呼吁作出后不会改变。
     * /
    公共无效setViewPager(ViewPager viewPager){
        mTabStrip.removeAllViews();        mViewPager = viewPager;
        如果(viewPager!= NULL){
            viewPager.setOnPageChangeListener(新InternalViewPagerListener());
            populateTabStrip();
        }
    }    / **
     *创建用于选项卡的默认视图。如果自定义选项卡视图不通过设置这就是所谓的
     * {@link #setCustomTabView(INT,INT)}。
     * /
    保护的TextView createDefaultTabView(上下文的背景下){
        TextView中的TextView =新的TextView(背景);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,TAB_VIEW_TEXT_SIZE_SP);
        textView.setTypeface(Typeface.DEFAULT_BOLD);
        textView.setLayoutParams(新LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));        的TypedValue outValue =新的TypedValue();
        的getContext()。getTheme()。resolveAttribute(android.R.attr.selectableItemBackground,
                outValue,真正的);
        textView.setBackgroundResource(outValue.resourceId);
        textView.setAllCaps(真);        INT填充=(int)的(TAB_VIEW_PADDING_DIPS * getResources()getDisplayMetrics()密度。);
        textView.setPadding(填充,填充,填充,填充);        返回的TextView;
    }    私人无效populateTabStrip(){
        最终PagerAdapter适配器= mViewPager.getAdapter();
        最后View.OnClickListener tabClickListener =新TabClickListener();        的for(int i = 0; I< adapter.getCount();我++){
            查看TabView的= NULL;
            TextView的tabTitleView = NULL;            如果(mTabViewLayoutId!= 0){
                //如果有一个自定义选项卡视图布局ID设置,尝试它充气
                TabView的= LayoutInflater.from(的getContext())。膨胀(mTabViewLayoutId,mTabStrip,
                        假);
                tabTitleView =(TextView中)tabView.findViewById(mTabViewTextViewId);
            }            如果(TabView的== NULL){
                TabView的= createDefaultTabView(的getContext());
            }            如果(tabTitleView == NULL和放大器;&安培; TextView.class.isInstance(TabView的)){
                tabTitleView =(TextView中)TabView的;
            }            如果(mDistributeEvenly){
                LinearLayout.LayoutParams LP =(LinearLayout.LayoutParams)tabView.getLayoutParams();
                lp.width = 0;
                lp.weight = 1;
            }            tabTitleView.setText(adapter.getPageTitle(I));
            tabView.setOnClickListener(tabClickListener);
            desc字符串= mContentDescriptions.get(I,NULL);
            如果(DESC!= NULL){
                tabView.setContentDescription(DESC);
            }            mTabStrip.addView(TabView的);
            如果(ⅰ== mViewPager.getCurrentItem()){
                tabView.setSelected(真);
            }
            // TODO:解决问题的颜色
            tabTitleView.setTextColor(getResources()getColorStateList(R.color.background_material_light));
            tabTitleView.setTextSize(14);
        }
    }    公共无效setContentDescription(INT I,desc字符串){
        mContentDescriptions.put(I,DESC);
    }    @覆盖
    保护无效onAttachedToWindow(){
        super.onAttachedToWindow();        如果(mViewPager!= NULL){
            scrollToTab(mViewPager.getCurrentItem(),0);
        }
    }    私人无效scrollToTab(INT的tabIndex,诠释positionOffset){
        最终诠释tabStripChildCount = mTab​​Strip.getChildCount();
        如果(tabStripChildCount == 0 ||的tabIndex℃,||的tabIndex> = tabStripChildCount){
            返回;
        }        查看selectedChild = mTab​​Strip.getChildAt(的tabIndex);
        如果(selectedChild!= NULL){
            INT targetScrollX = selectedChild.getLeft()+ positionOffset;            如果(的tabIndex大于0 || positionOffset大于0){
                //如果我们在第一个孩子不是和属于中档滚动,确保我们遵守偏移
                targetScrollX - = mTitleOffset;
            }            scrollTo(targetScrollX,0);
        }
    }    私有类InternalViewPagerListener实现ViewPager.OnPageChangeListener {
        私人诠释mScrollState;        @覆盖
        公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
            INT tabStripChildCount = mTab​​Strip.getChildCount();
            如果((tabStripChildCount == 0)||(位置℃下)||(位置> = tabStripChildCount)){
                返回;
            }            mTabStrip.onViewPagerPageChanged(位置,positionOffset);            查看selectedTitle = mTab​​Strip.getChildAt(位置);
            INT extraOffset =(selectedTitle!= NULL)
                    ? (中间体)(positionOffset * selectedTitle.getWidth())
                    :0;
            scrollToTab(位置,extraOffset);            如果(mViewPagerPageChangeListener!= NULL){
                mViewPagerPageChangeListener.onPageScrolled(位置,positionOffset,
                        positionOffsetPixels);
            }
        }        @覆盖
        公共无效onPageScrollStateChanged(INT状态){
            mScrollState =状态;            如果(mViewPagerPageChangeListener!= NULL){
                mViewPagerPageChangeListener.onPageScrollStateChanged(州);
            }
        }        @覆盖
        公共无效使用onPageSelected(INT位置){
            如果(mScrollState == ViewPager.SCROLL_STATE_IDLE){
                mTabStrip.onViewPagerPageChanged(位置,0F);
                scrollToTab(位置,0);
            }
            的for(int i = 0; I< mTab​​Strip.getChildCount();我++){
                mTabStrip.getChildAt(I).setSelected(位置== I)
            }
            如果(mViewPagerPageChangeListener!= NULL){
                mViewPagerPageChangeListener.onPageSelected(位置);
            }
        }    }    私有类TabClickListener实现View.OnClickListener {
        @覆盖
        公共无效的onClick(视图v){
            的for(int i = 0; I< mTab​​Strip.getChildCount();我++){
                如果(ⅴ== mTab​​Strip.getChildAt(ⅰ)){
                    mViewPager.setCurrentItem(ⅰ);
                    返回;
                }
            }
        }
    }}

要更具体的错误是在 mViewPager.setCurrentItem(一)项的功能;

 私有类TabClickListener实现View.OnClickListener {
        @覆盖
        公共无效的onClick(视图v){
            的for(int i = 0; I< mTab​​Strip.getChildCount();我++){
                如果(ⅴ== mTab​​Strip.getChildAt(ⅰ)){
                    mViewPager.setCurrentItem(ⅰ);
                    返回;
                }
            }
        }
    }


解决方案

什么是您的logcat抛出


  android.view.InflateException:二进制XML文件行#12:错误充气类片段


我的建议是,使用 SupportMapFragment代替MapFragment

呼叫类=com.google.android.gms.maps.SupportMapFragment

 <片段
            机器人:ID =@ + ID /图
            类=com.google.android.gms.maps.SupportMapFragment
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent/>

拨打

  GoogleMap的地图=((SupportMapFragment)getFragmentManager()。findFragmentById(R.id.map))
            .getMap();

修改

 <片段
            机器人:ID =@ + ID /图
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent
            机器人:名字=com.google.android.gms.maps.SupportMapFragment/>

拨打

  SupportMapFragment mapFragment =((SupportMapFragment)getChildFragmentManager()findFragmentById(R.id.map));
     GoogleMap的mapLocation = mapFragment.getMap();

I have created an application where I have 3 tabs and in the last one I have added a map, and here is the error because I get an error navigating with the tabs.

Take a look below the code

Tab fragment:

public class Tab3 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.tab_3, container, false);
        return v;
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/mapFrame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </FrameLayout>


</RelativeLayout>

Error:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: gon250.dublinbikes, PID: 22233
                                                                    android.view.InflateException: Binary XML file line #12: Error inflating class fragment
                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
                                                                        at tabs.Tab3.onCreateView(Tab3.java:32)
                                                                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
                                                                        at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
                                                                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
                                                                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
                                                                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
                                                                        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495)
                                                                        at customwidget.SlidingTabLayout$TabClickListener.onClick(SlidingTabLayout.java:287)
                                                                        at android.view.View.performClick(View.java:5254)
                                                                        at android.widget.TextView.performClick(TextView.java:10530)
                                                                        at android.view.View$PerformClick.run(View.java:21203)
                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:145)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6872)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                                                                     Caused by: java.lang.IllegalArgumentException: Binary XML file line #12: Duplicate id 0x7f0d0093, tag null, or parent id 0x7f0d0096 with another fragment for com.google.android.gms.maps.MapFragment
                                                                        at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2135)
                                                                        at android.app.Activity.onCreateView(Activity.java:5801)
                                                                        at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34)
                                                                        at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740)
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:821) 
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                                                                        at tabs.Tab3.onCreateView(Tab3.java:32) 
                                                                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                                                                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
                                                                        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
                                                                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
                                                                        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                                                                        at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
                                                                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
                                                                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552) 
                                                                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) 
                                                                        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495) 
                                                                        at customwidget.SlidingTabLayout$TabClickListener.onClick(SlidingTabLayout.java:287) 
                                                                        at android.view.View.performClick(View.java:5254) 
                                                                        at android.widget.TextView.performClick(TextView.java:10530) 
                                                                        at android.view.View$PerformClick.run(View.java:21203) 
                                                                        at android.os.Handler.handleCallback(Handler.java:739) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                        at android.os.Looper.loop(Looper.java:145) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6872) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

Class where is comming the error:

public class SlidingTabLayout extends HorizontalScrollView {
    /**
     * Allows complete control over the colors drawn in the tab layout. Set with
     * {@link #setCustomTabColorizer(TabColorizer)}.
     */
    public interface TabColorizer {

        /**
         * @return return the color of the indicator used when {@code position} is selected.
         */
        int getIndicatorColor(int position);

    }

    private static final int TITLE_OFFSET_DIPS = 24;
    private static final int TAB_VIEW_PADDING_DIPS = 16;
    private static final int TAB_VIEW_TEXT_SIZE_SP = 12;

    private int mTitleOffset;

    private int mTabViewLayoutId;
    private int mTabViewTextViewId;
    private boolean mDistributeEvenly;

    private ViewPager mViewPager;
    private SparseArray<String> mContentDescriptions = new SparseArray<String>();
    private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;

    private final SlidingTabStrip mTabStrip;

    public SlidingTabLayout(Context context) {
        this(context, null);
    }

    public SlidingTabLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // Disable the Scroll Bar
        setHorizontalScrollBarEnabled(false);
        // Make sure that the Tab Strips fills this View
        setFillViewport(true);

        mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);

        mTabStrip = new SlidingTabStrip(context);
        addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    }

    /**
     * Set the custom {@link TabColorizer} to be used.
     *
     * If you only require simple custmisation then you can use
     * {@link #setSelectedIndicatorColors(int...)} to achieve
     * similar effects.
     */
    public void setCustomTabColorizer(TabColorizer tabColorizer) {
        mTabStrip.setCustomTabColorizer(tabColorizer);
    }

    public void setDistributeEvenly(boolean distributeEvenly) {
        mDistributeEvenly = distributeEvenly;
    }

    /**
     * Sets the colors to be used for indicating the selected tab. These colors are treated as a
     * circular array. Providing one color will mean that all tabs are indicated with the same color.
     */
    public void setSelectedIndicatorColors(int... colors) {
        mTabStrip.setSelectedIndicatorColors(colors);
    }

    /**
     * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are
     * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so
     * that the layout can update it's scroll position correctly.
     *
     * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)
     */
    public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
        mViewPagerPageChangeListener = listener;
    }

    /**
     * Set the custom layout to be inflated for the tab views.
     *
     * @param layoutResId Layout id to be inflated
     * @param textViewId id of the {@link TextView} in the inflated view
     */
    public void setCustomTabView(int layoutResId, int textViewId) {
        mTabViewLayoutId = layoutResId;
        mTabViewTextViewId = textViewId;
    }

    /**
     * Sets the associated view pager. Note that the assumption here is that the pager content
     * (number of tabs and tab titles) does not change after this call has been made.
     */
    public void setViewPager(ViewPager viewPager) {
        mTabStrip.removeAllViews();

        mViewPager = viewPager;
        if (viewPager != null) {
            viewPager.setOnPageChangeListener(new InternalViewPagerListener());
            populateTabStrip();
        }
    }

    /**
     * Create a default view to be used for tabs. This is called if a custom tab view is not set via
     * {@link #setCustomTabView(int, int)}.
     */
    protected TextView createDefaultTabView(Context context) {
        TextView textView = new TextView(context);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
        textView.setTypeface(Typeface.DEFAULT_BOLD);
        textView.setLayoutParams(new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

        TypedValue outValue = new TypedValue();
        getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
                outValue, true);
        textView.setBackgroundResource(outValue.resourceId);
        textView.setAllCaps(true);

        int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
        textView.setPadding(padding, padding, padding, padding);

        return textView;
    }

    private void populateTabStrip() {
        final PagerAdapter adapter = mViewPager.getAdapter();
        final View.OnClickListener tabClickListener = new TabClickListener();

        for (int i = 0; i < adapter.getCount(); i++) {
            View tabView = null;
            TextView tabTitleView = null;

            if (mTabViewLayoutId != 0) {
                // If there is a custom tab view layout id set, try and inflate it
                tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
                        false);
                tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);
            }

            if (tabView == null) {
                tabView = createDefaultTabView(getContext());
            }

            if (tabTitleView == null && TextView.class.isInstance(tabView)) {
                tabTitleView = (TextView) tabView;
            }

            if (mDistributeEvenly) {
                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                lp.width = 0;
                lp.weight = 1;
            }

            tabTitleView.setText(adapter.getPageTitle(i));
            tabView.setOnClickListener(tabClickListener);
            String desc = mContentDescriptions.get(i, null);
            if (desc != null) {
                tabView.setContentDescription(desc);
            }

            mTabStrip.addView(tabView);
            if (i == mViewPager.getCurrentItem()) {
                tabView.setSelected(true);
            }
            //TODO: fix issue with color
            tabTitleView.setTextColor(getResources().getColorStateList(R.color.background_material_light));
            tabTitleView.setTextSize(14);
        }
    }

    public void setContentDescription(int i, String desc) {
        mContentDescriptions.put(i, desc);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        if (mViewPager != null) {
            scrollToTab(mViewPager.getCurrentItem(), 0);
        }
    }

    private void scrollToTab(int tabIndex, int positionOffset) {
        final int tabStripChildCount = mTabStrip.getChildCount();
        if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
            return;
        }

        View selectedChild = mTabStrip.getChildAt(tabIndex);
        if (selectedChild != null) {
            int targetScrollX = selectedChild.getLeft() + positionOffset;

            if (tabIndex > 0 || positionOffset > 0) {
                // If we're not at the first child and are mid-scroll, make sure we obey the offset
                targetScrollX -= mTitleOffset;
            }

            scrollTo(targetScrollX, 0);
        }
    }

    private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {
        private int mScrollState;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            int tabStripChildCount = mTabStrip.getChildCount();
            if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
                return;
            }

            mTabStrip.onViewPagerPageChanged(position, positionOffset);

            View selectedTitle = mTabStrip.getChildAt(position);
            int extraOffset = (selectedTitle != null)
                    ? (int) (positionOffset * selectedTitle.getWidth())
                    : 0;
            scrollToTab(position, extraOffset);

            if (mViewPagerPageChangeListener != null) {
                mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
                        positionOffsetPixels);
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            mScrollState = state;

            if (mViewPagerPageChangeListener != null) {
                mViewPagerPageChangeListener.onPageScrollStateChanged(state);
            }
        }

        @Override
        public void onPageSelected(int position) {
            if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
                mTabStrip.onViewPagerPageChanged(position, 0f);
                scrollToTab(position, 0);
            }
            for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                mTabStrip.getChildAt(i).setSelected(position == i);
            }
            if (mViewPagerPageChangeListener != null) {
                mViewPagerPageChangeListener.onPageSelected(position);
            }
        }

    }

    private class TabClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                if (v == mTabStrip.getChildAt(i)) {
                    mViewPager.setCurrentItem(i);
                    return;
                }
            }
        }
    }

}

To be more concrete the error is in the function below in the mViewPager.setCurrentItem(i);

private class TabClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                if (v == mTabStrip.getChildAt(i)) {
                    mViewPager.setCurrentItem(i);
                    return;
                }
            }
        }
    }

解决方案

Whats your logcat throws

   android.view.InflateException: Binary XML file line #12: Error inflating class fragment

My advice , use SupportMapFragment instead of MapFragment .

Call class="com.google.android.gms.maps.SupportMapFragment"

<fragment
            android:id="@+id/map"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

Call

 GoogleMap map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap();

Edit

<fragment
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="com.google.android.gms.maps.SupportMapFragment"/>

Call

     SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
     GoogleMap mapLocation = mapFragment.getMap();

这篇关于添加地图到Android TAB - 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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