跳至主要内容

博文

[Widget]RecyclePagerAdapter-实现ViewPager复用回收的PagerAdapter

RecyclePagerAdapter-实现ViewPager复用回收的PagerAdapter icon 实现ViewPager页卡View复用回收的PagerAdapter,只要是页面构造一样,则可以使用复用回收机制,同时也支持设置不同的viewType来实现多种样式的页卡回收复用,套用RecycleView的Adapter实现机制。 要求 com.android.support:support-v4 minSdkVersion 9 保持跟其他官方支持库版本一致(如:com.android.support:appcompat-v7) 链接 Github Bintray 引用 dependencies { ⋯ compile ' am.project:supportplus:24.2.1.1 ' ⋯ } 使用 整体实现其实不难,使用过RecycleView的话,就可以轻车熟路,跟其实现方案一模一样。 实现自己的PagerViewHolder,个人习惯在实例化时进行布局inflate,这样打开PagerViewHolder便可以直接找到使用的布局文件: public class MyPagerViewHolder extends RecyclePagerAdapter . PagerViewHolder { public MyPagerViewHolder ( ViewGroup parent ) { super ( LayoutInflater . from(parent . getContext()) .inflate( R . layout . item_recyclepager_page, parent, false )); } //应用到页面上的数据 public void setData ( String data ) { (( TextView ) itemView) . setText(data); } } 实现自己的RecyclePagerAdapter: public class MyRecycleP...

[Skill]getApplicationInfo的坑

getApplicationInfo的坑 一般情况下我们通过PackageManager.GET_UNINSTALLED_PACKAGES来检查应用是否安装,且不论其本身存在的不正确性,自Android 4.2(API 17)以后,多账户的出现,其又新出现一些坑。现在Android 7.0(API 24)使用MATCH_UNINSTALLED_PACKAGES 将其替换。 问题描述 在做微信分享操作之前,应用内先对微信App进行一次判断是否安装,使用的方法: public boolean checkApkExist( Context context, String packageName) { try { ApplicationInfo info = context . getPackageManager() . getApplicationInfo(packageName, PackageManager . GET_UNINSTALLED_PACKAGES ); if (info != null ) return true ; } catch ( PackageManager . NameNotFoundException e) { return false ; } return false ; } 在我的设备上存在两个账户,一个管理员账户用于日常使用,另一个普通账户用于开发,在我的管理员账户中安装了微信,而普通账户里面没有安装微信,但是在普通账户里运行这段代码,其会告诉你安装了微信。 问题分析 从API 24的源码可以看到,其实GET_UNINSTALLED_PACKAGES标志仅仅用于查询在手机系统分区存在数据目录的应用: /** * @deprecated replaced with {@link #MATCH_UNINSTALLED_PACKAGES} */ @Deprecated public static final int GET_UNINSTALLED_PACKAGES = 0x00002000; /** * Flag param...

[Skill]慎用onBackPressed()

慎用onBackPressed() Android中在按下back键时会调用到onBackPressed()方法,onBackPressed相对于finish方法,还做了一些其他操作,而这些操作涉及到Activity的状态,所以调用还是需要谨慎对待。 问题描述 最近公司的项目在Bug统计当中,发现了一大堆IllegalStateException的报错: java.lang . IllegalStateException : Can not perform this action after onSaveInstanceState at android.support.v4.app . FragmentManagerImpl . checkStateLoss( Unknown Source ) at android.support.v4.app . FragmentManagerImpl . popBackStackImmediate( Unknown Source ) at android.support.v4.app . FragmentActivity . onBackPressed( Unknown Source ) at android.view . View . performClick( View . java : 4768 ) at android.view . View $ PerformClick . run( View . java : 19692 ) at android.os . Handler . handleCallback( Handler . java : 739 ) at android.os . Handler . dispatchMessage( Handler . java : 95 ) at android.os . Looper . loop( Looper . java : 135 ) at android.app . ActivityThread . main( ActivityThread . java : 5539 ) at java.lang.reflect . Method . invoke( Nat...

[Widget]SelectionView-快速跳选View

SelectionView ICON 快速跳选View,与列表视图搭配使用(ListView、RecyclerView),常用于联系人列表快速选取。 预览 screenshots 要求 minSdkVersion 4 链接 Github Bintray 使用 基本布局 < am .widget.selectionview.SelectionView xmlns : app = " http://schemas.android.com/apk/res-auto " android : id = " @+id/selection_sv_selection " android : layout_width = " match_parent " android : layout_height = " match_parent " app : svBarBackground = " @drawable/bg_selection_bar " app : svBarItemHeight = " 32dp " app : svBarSlider = " @drawable/ic_selection_slider " app : svBarStyle = " List " app : svBarWidth = " 32dp " app : svNoticeAnimation = " true " app : svNoticeBackground = " @drawable/bg_selection_notice " app : svNoticeHeight = " 64dp " app : svNoticeLocation = " ViewCenter " app : svNoticePadding = " 1...

[Widget]MultiActionTextView-文字可点击TextView

MultiActionTextView ICON 文字可点击TextView,设置文字部分可点击,点击执行不同操作。 预览 screenshots 要求 无 链接 Github Bintray 使用 基本布局 < am .widget.multiactiontextview.MultiActionTextView android : layout_width = " match_parent " android : layout_height = " wrap_content " /> 基本代码 MultiActionTextView textView = ( MultiActionTextView ) findViewById(id); MultiActionClickableSpan action1 = new MultiActionClickableSpan ( 0 , 7 , colorPrimary, true , false , listener); MultiActionClickableSpan action2 = new MultiActionClickableSpan ( 10 , 15 , colorAccent, false , true , listener); MultiActionClickableSpan action3 = new MultiActionClickableSpan ( 134 , 140 , colorRipple, false , true , listener); textView . setText(text, action1, action2, action3); 注意 MultiActionClickableSpan可设置是否拦截View的OnClickListener响应 MultiActionClickableSpan可以设置不同的颜色

[Widget]HeaderFooterGridView-头尾GridView

HeaderFooterGridView ICON 头尾GridView,支持AUTO_FIT模式,头尾模式有两种,无反射代码。 预览 screenshots 要求 minSdkVersion 4 链接 Github Bintray 使用 基本布局 < am .widget.headerfootergridview.HeaderFooterGridView android : id = " @+id/gird_hfg_content " android : layout_width = " match_parent " android : layout_height = " match_parent " android : columnWidth = " 64dp " android : gravity = " center " android : horizontalSpacing = " 10dip " android : numColumns = " auto_fit " android : stretchMode = " columnWidth " android : verticalSpacing = " 10dip " /> 基本代码 HeaderFooterGridView hfgContent = ( HeaderFooterGridView ) findViewById(id); hfgContent . addHeaderView(headerView); hfgContent . removeHeaderView(headerView); hfgContent . addHeaderItem(headerItem); hfgContent . removeHeaderItem(headerItem); hfgContent . addHeaderItem(headerItem...

[Widget]DrawableRatingBar-图片评级

DrawableRatingBar ICON 图片评级,双图片评级控件,可设置图片间距,支持拖动进度及点击进度,可控制最大值最小值,及是否可手动。 预览 screenshots 要求 minSdkVersion 4 链接 Github Bintray 使用 基本布局 < am .widget.drawableratingbar.DrawableRatingBar xmlns : app = " http://schemas.android.com/apk/res-auto " android : layout_width = " match_parent " android : layout_height = " wrap_content " android : layout_gravity = " center " android : drawablePadding = " 3dp " android : minHeight = " 120dp " android : padding = " 10dp " android : progressDrawable = " @drawable " app : drbGravity = " center " app : drbManually = " true " app : drbMax = " 6 " app : drbMin = " 1 " app : drbOnlyItemTouchable = " true " app : drbRating = " 4 " /> 基本代码 mRating . setRatingDrawable( Drawable , Drawable ); mRating . se...