0%

前言

又到春节,大家这几天抢红包抢得高兴吗?最近,安卓“辅助功能”特性的应用倒是越来越火了,比如免Root自动安装应用、微信自动抢红包等,这些都是利用安卓的Accessibility实现的,所以是时候了解一下Accessibility了。

阅读全文 »

今年的最后一篇博客,什么也不写了,就祝大家新年快乐,阖家幸福!

前言

农历腊月二十五,年味也愈加浓重了,在新年到来之前争取再多更新几篇博客。此文讲解安卓的权限管理,主要是针对Android 6.0新增加的动态权限获取的使用方法。

阅读全文 »

前言

在Windows桌面鼠标右击菜单中,通常会出现很多多余的选项,比如显卡相关设置,office相关功能,而这些选项大多数人是不会经常去使用它们的,放在这里反而碍眼,特别是对于强迫症来说这能忍么,而且这样会减缓系统加载速度,表现就是电脑卡的时候想右击刷新,可右击菜单会死活弹不出来…这篇文章就交大家如何去掉右击菜单中的多余选项.
桌面鼠标右击菜单

阅读全文 »

滑动视图

滑动视图就是在顶栏有个Tab标题栏,显示内容的标题,下面正文区域是ViewPager构成的可以滑动切换的布局,这种设计也是很常见的,一般用于新闻,应用市场等应用,Tab栏展示分类标题,ViewPager展示正文内容。

阅读全文 »

Xml与Html的区别

尽管Xml与Html都是标准通用标记语言(SGML)的衍生语言,但还是存在不少区别:

  • Xml对大小写很敏感,例如<H1><h1>是不同的Xml标签
  • Html在能够分清段落结尾时候结束标签(</p></li>)可以省略,但是Xml中绝对不可以省略标签
  • 在Xml中,属性值的引号是必须要有的,但Html中是可有可无的,如width=300
  • 在Xml中,只有单个标签而没有相对应的结束标签的元素必须以/结尾,如<img src="test.png" />
  • 在Html中,属性可以只有名字没有值,在Xml中这是不允许的

Xml文档规范

  • 最好加上文档头 <?xml version=1.0?>

  • 避免使用混合式内容:

    1
    2
    3
    4
    5
    <!--以下做法不推荐使用-->
    <font>
    Helvetica
    <size>36</size>
    </font>
  • 属性只应该用来对修改值的描述,而不是用来指定值

解析Xml文档

Java提供了两种Xml解析器

  • 像文档对象模型(Document Object Model, DOM)解析器这样的叫树型解析器,它们将读入的Xml文档转换成树结构
  • 像Xml简单Api(Simple API for Xml, SAX)解析器这样的流机制解析器,它们在读入Xml文档时生成相应的事件
  1. DOM解析器对于实现大多数目的来说都更容易一些。但如果要处理很长的文档,用它生成树结构将会消耗大量内存,或者如果只是对于某些元素感兴趣,而不关心它们的上下文,那么在这些情况下应该考虑使用流机制解析器。
  2. 对于获取到的数据通常 trim()一下

待续

前言

安卓学习的第一课应该就讲了安卓弹出消息Toast的使用,它能够简单快捷有效地以气泡方式提醒用户,但在MaterialDesign盛行的今天,Toast未免也太Low了,本文要讲的即是Toast的取代者——Snackbar。

Snackbar介绍

Snackerbar简单说就是用来取代Toast的,所以这里就不多说,放两张图大家自行体会。

阅读全文 »

Navigation Drawer介绍

导航抽屉(NavigationDrawer)是一个面板,该面板显示应用程序的主导航选项在屏幕的左边缘。它通常是隐藏的,但当手指从屏幕左边缘滑出时,在应用程序中的最高层次,在动作栏中用户触摸应用程序图标。

官方介绍总是那么不接地气,其实就是一个从左边拉出来的抽屉而已,是一个很常见的效果,说的再多也不如贴一张图看得明白。
网易云音乐截图

关于导航抽屉的设计原则,可以参见Google设计指南,此文只讲如何实现导航抽屉效果。

创建 DrawerLayout

首先以DrawerLayout为根布局,在其中添加主布局和导航目录布局。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 主布局 -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 导航抽屉布局 -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

几点注意事项:

  • 主布局必须放在DrawerLayout的第一位子孩子
  • 主布局的长宽需设置为match_parent,因为在抽屉隐藏与否主布局的大小是会改变的;
  • 导航抽屉布局需要指定layout_gravity属性为start;
  • 导航抽屉的宽不能超过320dp以不占满屏幕

初始化抽屉目录列表

通常抽屉目录列表由ListView组成,所以通常用Adapter(如ArrayAdapter或SimpleCursorAdapter)来进行初始化操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends Activity {
private String[] mPlanetTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);

// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

...
}
}

处理抽屉目录点击事件

实现ListView.OnItemClickListener接口重写onItemClick()方法即可,此处给出切换Fragment的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectItem(position);
}
}

/** Swaps fragments in the main content view */
private void selectItem(int position) {
// Create a new fragment and specify the planet to show based on position
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);

// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();

// Highlight the selected item, update the title, and close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}

@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}

监听开关抽屉事件

需要监听抽屉,先要setDrawerListener(),实现DrawerLayout.DrawerListener接口;也可以继承ActionBarDrawerToggle类(实现了DrawerLayout.DrawerListener接口),重写相应的回调函数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...

mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}

/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};

// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
}

/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
}

至此,抽屉导航的基本使用就介绍得差不多了,更多玩法大家可以自行探索。

前言

最近在写Java蓝牙串口通信读取数据中,需要将读取到的十六进制数转换为16位的有符号整数,网上Google一大堆,均无果,最后在StackOverFlow上找到了答案。

阅读全文 »