AndroidX
Existing packages, such as the Android Support
Library, are being refactored into AndroidX.
Although Support Library versions 27 and lower
are still available on Google Maven,
all new development will be included in only AndroidX versions 1.0.0 and higher.
AndroidX 是对 android.support.xxx 包的整理后产物。
常用包对应关系
com.android.support:support-compat androidx.core:core:1.0.0+
com.android.support:appcompat-v7 androidx.appcompat:appcompat:1.0.0+
com.android.support:design com.google.android.material:material:1.0.0+
com.android.support:multidex androidx.multidex:multidex:2.0.0+
com.android.support:recyclerview-v7 androidx.recyclerview:recyclerview:1.1.0
com.android.support:viewpager androidx.viewpager:viewpager:1.0.0+
com.android.support:support-fragment androidx.fragment:fragment:1.0.0+
AppcompaActivity相对于Activity的主要的两点变化;
主界面带有toolbar的标题栏;
theme主题只能用android:theme=”@style/AppTheme (appTheme主题或者其子类),而不能用android:style。 否则会提示错误: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
toolbar就是actionbar的进阶 返回箭头、图标、标题、菜单、搜索框
※Fragment
而如果要使用support库的Fragment,Activity必须要继承FragmentActivity(FragmentActivity是的AppCompatActivity子类)。
public void onAttach(Context context) {
mActivity = (Activity) context;
mParam = getArguments().getString(ARG_PARAM); //获取参数
}
生命周期
onAttach ->onCreate -> onCreateView->onActivityCreated->onStart->onResume->Runing
Runing->onPause->onStop->onDestroy->onDetach
使用getSupportFragmentManager()获取FragmentManager。
例子:viewpager与fragment的简单实用用例
listfragment = new ArrayList<Fragment>();
f1 = new L2Fragment();
f2 = new A2Fragment();
listfragment.add(f1);
listfragment.add(f2);
FragmentManager fm = getSupportFragmentManager();
MainFragmentPagerAdapter mfpa = new MainFragmentPagerAdapter(fm, listfragment); mainviewpager.setAdapter(mfpa);
f1.setLLdotListenner(this);
Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。
Fragment向Activity传递数据
首先,在Fragment中定义接口,并让Activity实现该接口(具体实现省略):
public interface OnFragmentInteractionListener { void onItemClick(String str); //将str从Fragment传递给Activity}
在Fragment的onAttach()中,将参数Context强转为OnFragmentInteractionListener对象:
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}}
并在Fragment合适的地方调用mListener.onItemClick("hello")将”hello”从Fragment传递给Activity。
Activity向Fragment传递数据
Activity向Fragment传递数据比较简单,获取Fragment对象,并调用Fragment的方法即可,比如要将一个字符串传递给Fragment,则在Fragment中定义方法:
public void setString(String str) {
this.str = str;}
并在Activity中调用fragment.setString("hello")即可。
※Viewpager
ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。
ViewPager类需要一个PagerAdapter适配器类给它提供数据。
ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
FragmentPagerAdapter 和 FragmentStatePagerAdapter的区别
在使用Fragment来适配ViewPager的时候,我们可以选择FragmentPagerAdapter 或者FragmentStatePagerAdapter作为适配器。
FragmentPagerAdapter
FragmentPagerAdapter继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter
FragmentStatePagerAdapter
FragmentStatePagerAdapter和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的** 'State'** 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
例子:
//viewpager的适配器
public class MainFragmentPagerAdapter extends FragmentStatePagerAdapter {
private FragmentManager fragmetnmanager; //创建FragmentManager
private List<Fragment> listfragment; //创建一个List<Fragment>
public MainFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.fragmetnmanager = fm;
this.listfragment = list;
}
@Override
public Fragment getItem(int arg0) {
return listfragment.get(arg0); //返回第几个fragment
}
@Override
public int getCount() {
return listfragment.size(); //总共有多少个fragment
}
}
翻页动画继承
DepthPageTransformer implements ViewPager.PageTransformer
重写transformPage(View view, float position)
※Palette
从bitmap中获取调色板,获取主色调
例子:
Bitmap bitmap = drawableToBitmap(commonUsedAppModel.getIcon());
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@Nullable Palette palette) {
Palette.Swatch s = palette.getVibrantSwatch();
if (s == null) {
for (Palette.Swatch swatch : palette.getSwatches()) {
s = swatch;
break;
}
}
bg_im.setImageDrawable(new ColorDrawable(s.getRgb()));
}
});
Palette.Swatch s = palette.getDominantSwatch();//独特的一种
Palette.Swatch s1 = palette.getVibrantSwatch(); //获取到充满活力的这种色调
Palette.Swatch s2 = palette.getDarkVibrantSwatch(); //获取充满活力的黑
Palette.Swatch s3 = palette.getLightVibrantSwatch(); //获取充满活力的亮
Palette.Swatch s4 = palette.getMutedSwatch(); //获取柔和的色调
Palette.Swatch s5 = palette.getDarkMutedSwatch(); //获取柔和的黑
Palette.Swatch s6 = palette.getLightMutedSwatch(); //获取柔和的亮
利用采集的色调样本swatch对象给需要的东西赋予颜色了,有如下几个方法:
getPopulation(): the amount of pixels which this swatch represents.
getRgb(): the RGB value of this color.
getHsl(): the HSL value of this color.
getBodyTextColor(): the RGB value of a text color which can be displayed on top of this color.
getTitleTextColor(): the RGB value of a text color which can be displayed on top of this color.
※NestedScrollView
NestedScrollView 即 支持嵌套滑动的 ScrollView。可以方便的直接嵌套recycleview,而不用担心滑动冲突问题。
※CardView
卡片效果,圆角、阴影。
例子:
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
app:cardCornerRadius="5dp">
<TextView
android:id="@+id/ext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="CardView"
/>
</android.support.v7.widget.CardView>
※FloatingActionButton
悬浮按钮
※PermissionChecker
checkCallingOrSelfPermission(Context context, String permission)
检查您正在处理的IPC或您的应用是否具有给定权限,以及是否允许与此权限相对应的应用操作。
checkCallingPermission(Context context, String permission, String packageName)
检查您正在处理的IPC是否具有给定权限,以及是否允许与此权限相对应的应用程序操作。
checkPermission(Context context, String permission, int pid, int uid, String packageName)
检查UID和PID中的给定包是否具有给定权限以及是否允许与此权限对应的应用操作。
checkSelfPermission(Context context, String permission)
检查您的应用是否具有给定的权限以及是否允许与此权限相对应的应用操作。