1 fragment入门


可以理解为activity的一部分。


fragment:翻译为分片的意思。


fragment用在ViewGroup中 就是布局中,比如LinearLayout 或者其他的布局.


inflater:可以讲一个布局文件转换成一个View


[1]在activity布局中定义fragment (第一种方式定义fragment) 一般不用这种
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:layout_width="match_parent"    android:layout_height="match_parent">    <fragment android:name="com.itheima.fragment.Fragment1"            android:id="@+id/list"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent" />    <fragment android:name="com.itheima.fragment.Fragment2"            android:id="@+id/viewer"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent" /></LinearLayout>
[2]声明fragment
//定义一个Fragment public class Fragment1 extends Fragment {//当用户第一次画ui的时候调用  要显示Fragment自己的内容  setContentView(R.layout.activity_main);@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {//[1]通过打气筒把一个布局转换成view对象 View view = inflater.inflate(R.layout.fragment1, null);return view;}}

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >        <TextView          android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="我是fragment1里面的内容"        />    </LinearLayout>


[3]name属性 要指定我们自己定义的fragment


___________________________________________________________

2 动态添加fragment
我们一般通过这种方式添加fragment
> 允许我们更新界面上的某一部分,它实际上就是嵌入到了activity中的一部分 ,一个轻量级的activity

> 事务:把事务封装起来,一组事务同时都执行成功了,那么它就成功了,就算执行失败,那么它也可以回到执行前的时期.
事务:执行一段逻辑 要么同时成功 要么同时失败 银行转账
> android系统引出事务的概念:我们在更新界面上的某一个部分,为了保证界面完全更新.所以用事务包装起来.

> 不需要再清单文件中注册

public class MainActivity extends Activity {@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]获取手机的宽和高 windommanagerWindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();// [2]判断横竖屏// [3.1]获取fragment的管理者FragmentManager manager = getFragmentManager();// [3.2]开启一个事务FragmentTransaction transaction = manager.beginTransaction();if (height > width) {// 说明是竖屏 android 代表系统定义好的 android.R.id.content理解成是当前手机的窗体transaction.replace(android.R.id.content, new Fragment1());} else {// 横屏transaction.replace(android.R.id.content, new Fragment2());}//[4]一定要记得 提交commit transaction.commit();}}



___________________________________________________________
3 使用fragment创建一个选项卡页面(模拟微信主界面)
public class MainActivity extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]找到我们关心的控件Button btn_contact = (Button) findViewById(R.id.btn_contact);Button btn_discover = (Button) findViewById(R.id.btn_discover);Button btn_me = (Button) findViewById(R.id.btn_me);Button btn_wx = (Button) findViewById(R.id.btn_wx);// [2]给按钮设置点击事件btn_contact.setOnClickListener(this);btn_discover.setOnClickListener(this);btn_me.setOnClickListener(this);btn_wx.setOnClickListener(this);}@Overridepublic void onClick(View v) {// [3]具体判断一下我点击的是哪个按钮//[4]获取fragment的管理者 FragmentManager fragmentManager = getFragmentManager();//[5]开启事物 FragmentTransaction transaction = fragmentManager.beginTransaction();switch (v.getId()) {case R.id.btn_wx: // 说明点击了微信按钮transaction.replace(R.id.ll, new WxFragment());break;case R.id.btn_contact: // 说明点击了微信按钮transaction.replace(R.id.ll, new ContactFragment());break;case R.id.btn_discover: // 说明点击了微信按钮transaction.replace(R.id.ll, new DiscoverFragment());break;case R.id.btn_me: // 说明点击了微信按钮transaction.replace(R.id.ll, new MeFragment());break;}//[6]最后一布 记得 提交事物 transaction.commit();}}




___________________________________________________________
4 使用fragment兼容低版本的写法(全部引用V4包下的)
[1]定义fragment继承V4包中的Fragment ;不能用app包下的。 [2]定义的activity要继承v4包中的FragmentActivity ; 不能继承Activity
小细节 : 当你使用V4包下的Fragment的时候。 不能和上面一样去拿getFragmentManager(),不然会报错. [3]通过这个方法getSupportFragmentManager 获取Fragment的管理者
这几年基本上都直接用APP包里面的。因为最低版本都使用4.0的。 ___________________________________________________________
5 fragment的生命周期
public class DiscoverFragment extends Fragment {//依附在activity上@Overridepublic void onAttach(Activity activity) {System.out.println("onAttach");super.onAttach(activity);}@Overridepublic void onCreate(Bundle savedInstanceState) {System.out.println("onCreate");super.onCreate(savedInstanceState);}//Fragment 加载一个布局  显示Fragment的内容 @Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_discover, null);System.out.println("onCreateView");return view; }//在这个onCreateView方法中初始化的view  完全初始化 @Overridepublic void onActivityCreated(Bundle savedInstanceState) {System.out.println("onActivityCreated");super.onActivityCreated(savedInstanceState);}@Overridepublic void onStart() {System.out.println("onStart");super.onStart();}@Overridepublic void onResume() {System.out.println("onResume");super.onResume();}@Overridepublic void onPause() {System.out.println("onPause");super.onPause();}//当界面不可见@Overridepublic void onStop() {System.out.println("onStop");super.onStop();}//在oncreateView方法里面初始化的view销毁了@Overridepublic void onDestroyView() {System.out.println("onDestroyView");super.onDestroyView();}@Overridepublic void onDestroy() {System.out.println("onDestroy");super.onDestroy();}//取消依附 @Overridepublic void onDetach() {System.out.println("onDetach");super.onDetach();}}


一般我们重写两个方法就行了。一个是onCreateView 一个是 onDestroy 或者onDestroyView ___________________________________________________________
6 fragment之间的通信 [1]Fragment有一个公共的桥梁 Activity 我们首先在activity中动态的开启两个Fragment; 然后我们用动态替换的三个参数的方法。最后一个参数是标签。
然后我们就在Fragment1中定义一个按钮,去实现把Fragment2中的 TextView 的数值改变。

这里我们要实现在一个Fragment中修改另一Fragment的控件, 我们需要借助他们公共依附的activity这个桥梁来实现获取Fragment的实例,然后再去调用它的方法。
当我们要在Fragment中打印tuast的时候也是需要获取context 。我们就可以使用 getActivity这个方法。 ___________________________________________________________
7 menu菜单
[1]添加菜单方式 通过一个布局 在res下 meun目录下创建一个布局
orderInCategory这个就是条目顺序

[2]动态的添加 groupId:int 分组的id
itemId:int 调理的id
order;int 这个菜单子菜单的顺序
title;char 这个菜单显示的标题
menu.add(groupId, itemId, order, title);

[3]点击menu弹出一个对话框 如果你想实现自己定义的view 效果重onMeunOpened方法

这个方法就是当你点击menu的时候调用,如果你没有重写这个方法,它默认为true
然后就会去执行onCreateOptionsMenu 这个方法。
如果你想实现自己定义的效果我们就需要重写这个方法。所以我们直接返回flase。
//当点击menu按键的时候执行这个方法 @Overridepublic boolean onMenuOpened(int featureId, Menu menu) {//弹出一个对话框 AlertDialog.Builder builder = new Builder(this);builder.setTitle("警告");builder.setMessage("您的网络异常");builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("点了确定");}});builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//点击取消执行 System.out.println("取消");}});//使用对话框一定要记得show出来 builder.show();return false;}


___________________________________________________________
8 AutoCompleteTextView控件的使用 这个控件相当于一个搜索提示。 默认的是你输入两个字符进行匹配。

我们可以在XML 里面设置他为1个字符进行匹配。
 <AutoCompleteTextView        android:id="@+id/actv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:completionThreshold="1"   //这里就是几个字符进行匹配              />



public class MainActivity extends Activity {//[0]声明AutoCompleteTextView要显示的数据  private static final String[] COUNTRIES = new String[] {         "laofang", "laozhang", "laoli", "laobi","laoli","laowang","aab","abb","cc"     };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[1]找到控件AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.actv);//[2]创建数据适配器        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,                android.R.layout.simple_dropdown_item_1line, COUNTRIES);        //[3]设置数据适配器        actv.setAdapter(adapter);}}

___________________________________________________________
9 补间动画 [1]透明
//点击按钮 实现iv 透明的效果  动画 public void click1(View v) { //1.0意味着着完全不透明 0.0意味着完全透明      fromAlpha:从透明度 多少开始   toAlpha: 到透明度多少结束AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);aa.setDuration(2000); //设置动画执行的时间aa.setRepeatCount(1); //设置重复的次数aa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式//iv开始执行动画 iv.startAnimation(aa);}


[2]旋转
//点击按钮 实现iv 执行一个旋转 动画 public void click2(View v) { //fromDegrees 开始角度   toDegrees 结束角度//RotateAnimation  ra = new RotateAnimation(0, 360);// pivotXType:中心点X的类型     可以是相当于自己    或者相对于父控件  或者绝对的 (相当于你自己指定的一个点)     //pivotXValue:就是你设置的类型的X 轴长度乘以你的值。  比如你设置为 相当于自己,然后值设置为0.5f 那就是 你这张图片的一半。RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);ra.setDuration(2000); //设置动画执行的时间ra.setRepeatCount(1); //设置重复的次数ra.setRepeatMode(Animation.REVERSE);//设置动画执行的模式//iv开始执行动画 iv.startAnimation(ra);}


[3]缩放
//点击按钮进行一个缩放动画public void click3(View v) { //fromX 从多少 大小  开始 ;toX 到多少的大小ScaleAnimation sa = new ScaleAnimation(1.0f,2.0f, 1.0f, 2.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);sa.setDuration(2000); //设置动画执行的时间sa.setRepeatCount(1); //设置重复的次数sa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式//iv开始执行动画 iv.startAnimation(sa);}


[4]位移
//位移动画 public void click4(View v){TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.2f); ta.setDuration(2000); //设置动画执行的时间 ta.setFillAfter(true);//当动画结束后 动画停留在结束位置  //开始动画 iv.startAnimation(ta);}



【5】实现组合动画
//动画一起飞public void click5(View v){AnimationSet set = new AnimationSet(false);//其实就是一个set集合,用来保存所有的动画效果。//透明动画AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);aa.setDuration(2000); //设置动画执行的时间aa.setRepeatCount(1); //设置重复的次数aa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式//旋转动画RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);ra.setDuration(2000); //设置动画执行的时间ra.setRepeatCount(1); //设置重复的次数ra.setRepeatMode(Animation.REVERSE);//设置动画执行的模式//缩放ScaleAnimation sa = new ScaleAnimation(1.0f,2.0f, 1.0f, 2.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);sa.setDuration(2000); //设置动画执行的时间sa.setRepeatCount(1); //设置重复的次数sa.setRepeatMode(Animation.REVERSE);//设置动画执行的模式TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.2f); ta.setDuration(2000); //设置动画执行的时间 ta.setFillAfter(true);//当动画结束后 动画停留在结束位置 //添加动画set.addAnimation(aa);set.addAnimation(ra);set.addAnimation(sa);set.addAnimation(ta);//最后一步 要记得 执行动画iv.startAnimation(set);}


总结: 动画效果不会改变控件真实的坐标 也就是说如果你的图片,位置因为你设置的效果而改变了位置。 如果你去实现它的点击事件的时候,在改变了的位置上点击是没有效果的。

___________________________________________________________
10 应用程序的反编译 apktools dex2jar jd.exe 就看程序源码 Android逆向助手

___________________________________________________________
11 使用xml方式定义补间动画 [1]在res下创建一个目录 anim目录 [2]在anim目录里面创建你需要动画的xml文件
<?xml version="1.0" encoding="utf-8"?><translate    android:fromXDelta="0%p"    android:toXDelta="0%p"    android:fromYDelta="0%p"    android:toYDelta="20%p"        android:fillAfter="true"    android:duration="2000"    xmlns:android="http://schemas.android.com/apk/res/android">                </translate>


<?xml version="1.0" encoding="utf-8"?><scale    android:fromXScale="1.0"    android:toXScale="2.0"    android:fromYScale="1.0"    android:toYScale="2.0"    android:pivotX="50%"    android:pivotY="50%"    android:repeatMode="reverse"    android:repeatCount="1"    android:duration="2000"    xmlns:android="http://schemas.android.com/apk/res/android">    </scale>


<?xml version="1.0" encoding="utf-8"?><rotate    android:fromDegrees="0"    android:toDegrees="360"    android:pivotX="50%"    android:pivotY="50%"//这里要注意一下,如果直接设置50%那就是相对于自己来说。如果你在%号后面加上一个小写的p 那就是相当于父控件来说。    android:repeatCount="1"    android:repeatMode="reverse"    android:duration="2000"    xmlns:android="http://schemas.android.com/apk/res/android">    </rotate>


<?xml version="1.0" encoding="utf-8"?><alpha    android:fromAlpha="1.0"    android:toAlpha="0.0"    android:duration="2000"    android:repeatMode="reverse"    android:repeatCount="1"    xmlns:android="http://schemas.android.com/apk/res/android">    </alpha>
//点击按钮 实现iv 透明的效果  动画 public void click1(View v) { Animation aa = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha);//这里我们要使用这个工具类 去加载定义好的xml//iv开始执行动画 iv.startAnimation(aa);}
//点击按钮 实现iv 执行一个旋转 动画 public void click2(View v) { Animation ra = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);//iv开始执行动画 iv.startAnimation(ra);}//点击按钮进行一个缩放动画public void click3(View v) { Animation sa= AnimationUtils.loadAnimation(getApplicationContext(), R.anim.scale);//iv开始执行动画 iv.startAnimation(sa);}//位移动画 public void click4(View v){Animation ta = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate); //开始动画 iv.startAnimation(ta);}//动画一起飞public void click5(View v){Animation set = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.set);//最后一步 要记得 执行动画iv.startAnimation(set);}

在xml里面写组合动画。
<?xml version="1.0" encoding="utf-8"?><set>    <alpha        xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="2000"        android:fromAlpha="1.0"        android:repeatCount="1"        android:repeatMode="reverse"        android:toAlpha="0.0" >    </alpha>    <rotate        xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="2000"        android:fromDegrees="0"        android:pivotX="50%"        android:pivotY="50%"        android:repeatCount="1"        android:repeatMode="reverse"        android:toDegrees="360" >    </rotate>    <scale        xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="2000"        android:fromXScale="1.0"        android:fromYScale="1.0"        android:pivotX="50%"        android:pivotY="50%"        android:repeatCount="1"        android:repeatMode="reverse"        android:toXScale="2.0"        android:toYScale="2.0" >    </scale>    <translate        xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="2000"        android:fillAfter="true"        android:fromXDelta="0%p"        android:fromYDelta="0%p"        android:toXDelta="0%p"        android:toYDelta="20%p" >    </translate></set>



___________________________________________________________
12 属性动画 属性动画会改变控件真实的坐标 和属性。他会把你的图片真实的改变。
//位移动画public void translate(View v){//创建属性动画/** * target 执行的目标   * propertyName 属性名字  。这个参数就是我们指定的控件的自带的参数。比如iv可以设置一个setTranslationX(translationx); * 这里面的translationx 就是这里我们需要填写的参数. * float... values 可变参数    就是我们先移动到哪,然后在移动到哪。 * 我们为了实现属性动画,我们需要用到ObjectAnimator这个类 */ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 10, 50,20,100);oa.setDuration(2000);oa.start(); //开始动画}//缩放动画public void scale(View v){ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "scaleY", 0.1f, 2, 1, 2);oa.setDuration(2000);oa.start();}//实现透明的效果 public void alpha(View v){ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.5f, 0, 1,0,1);oa.setDuration(2000);oa.start();}//实现旋转的效果public void rotate(View v){//ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "rotation", 0, 180, 90, 360);这里如果这是rotation就是按照x y轴旋转ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "rotationX", 0, 180, 90, 360);oa.setDuration(2000);oa.start();}

//一起飞 public void fly(View v){AnimatorSet as = new AnimatorSet();//注意属性动画的set 是AnimatorSet集合。不要搞错ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 10, 50, 20, 100);ObjectAnimator oa2 = ObjectAnimator.ofFloat(iv, "scaleY", 0.1f, 2, 1, 2);ObjectAnimator oa3 = ObjectAnimator.ofFloat(iv, "alpha", 0, 0.5f, 0, 1);ObjectAnimator oa4 = ObjectAnimator.ofFloat(iv, "rotationY", 0, 180, 90, 360);as.setDuration(2000);//执行动画时长as.setTarget(iv);//iv执行动画 .指定谁执行//往集合中添加动画//挨个飞as.playSequentially(oa, oa2, oa3, oa4);//Sequentially:循序地//一起飞//as.playTogether(oa, oa2, oa3, oa4);as.start();}

12.1 在xml里面定义属性动画 [1]如果使用xml方式定义属性动画 要在res下创建一个animator目录
<?xml version="1.0" encoding="utf-8"?><animator xmlns:android="http://schemas.android.com/apk/res/android" >    <objectAnimator        android:duration="2000"        android:propertyName="translationX"        android:valueFrom="10"        android:valueTo="100" >    </objectAnimator></animator>

//使用xml的方式创建属性动画public void playxml(View v){ObjectAnimator oa = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.oanimator);//设置执行目标oa.setTarget(iv);oa.start();//开始执行}




___________________________________________________________
13 通知栏的介绍
给用户提示有以下这些方式:
[1]Toast
[2]对话框
[3]通知栏
public class MainActivity extends Activity {private NotificationManager nm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[1]获取通知的管理者 nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);}//点击按钮发送通知public void click1(View v) {//兼容低版本的写法  用过时的方法       //第一个参数 图标 第二个参数内容  第三个参数  调用这条通知的时间Notification noti = new Notification(R.drawable.ic_launcher, "接收到了一条通知", System.currentTimeMillis());//实现呼吸灯 震动一下    noti.defaults = Notification.DEFAULT_ALL;//不删除通知 noti.flags = Notification.FLAG_NO_CLEAR;//创建意图对象Intent intent = new Intent();//实现打电话的逻辑 intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:"+119));//需要添加打电话的权限 Task//PendingIntent一个延期的意图,如果你这个意图雨activity相关就调用getactivity 如果与service相关就调用getservice.....PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 1, intent, Intent.FLAG_ACTIVITY_NEW_TASK);//第一个参数 上下文   第二个参数 大标题   第三个参数 内容   第四个参数 就是一个延期的意图noti.setLatestEventInfo(this, "小芳", "今天晚上7天酒店....", pendingIntent);//[2]发送通知 nm.notify(10, noti);}//点击按钮 关闭通知public void click2(View v) {//取消通知nm.cancel(10);}}


public void click1(View v) {//链式调用  高版本的写法  Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+119)); PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, Intent.FLAG_ACTIVITY_NEW_TASK); Notification noti = new Notification.Builder(this)         .setContentTitle("我是大标题")         .setContentText("我是标题的内容")         .setSmallIcon(R.drawable.ic_launcher)         .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))         .setDefaults(Notification.DEFAULT_SOUND)         .setContentIntent(pendingIntent)         .build(); nm.notify(10, noti);}



记住需要加:android.permission.VIBRATE 这个权限 才能实现调用震动。


总结学过的manager :
[1]smsManager 发短信
[2]telephoneManager 电话的管理者
[3]windowManager 窗口的管理者
[4]fragmenManager fragment的管理者
[5] NotificationManager 通知的管理者
[6]SensorManager 传感器管理者


___________________________________________________________
14 通知栏和服务连用
public class TestService extends Service {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}//当服务第一次开启的时候 @Overridepublic void onCreate() {//确保这个服务运行在前台进程 这个方法可以使当前服务 提升为前台进程//startForeground(id, notification)super.onCreate();}}




更多相关文章

  1. android设置默认程序
  2. Android中父子窗体调用类似模式窗体应用
  3. 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
  4. android的Spinner控件的自定义样式设置以及ArrayAdapter的使用
  5. Android开发:设置圆形Button
  6. Android(安卓)AsyncTask几个注意事项
  7. Android约束布局ConstraintLayout动态设置Id失效问题解决办法
  8. Android控件属性全解
  9. Android使用https链接

随机推荐

  1. Android(安卓)Wear Preview - UI
  2. android生命周期_Android活动生命周期–
  3. Android(安卓)实现开关灯效果
  4. Android(安卓)android下的电话拨号器
  5. Android之拍照
  6. Android(安卓)键盘驱动
  7. Android之 drawTextOnpath
  8. Android(安卓)-- 解决Android(安卓)Studi
  9. android ios vue 互调
  10. android复合控件