Android开发小知识点
一、隐藏活动标题
1、代码设置:在onCreate()方法中
requestWindowFeature(Window.FEATURE_NO_TITLE);
2、 在manifest.xml中设置
android:theme="@android:style/Theme.NoTitleBar"
二、Toast中传入Context实例
Toast在Activity中,使用this返回一个Context实例
Toast在AlertDialog中使用,因此使用getApplicationContext()方法返回一个Context实例
注意:
TextView tv=new TextView(this);
创建View对象时,传入的参数是Context对象,因为Activity类是Context类的子类,因此可以使用this关键字来代表这个Context对象。
三、Activity和Fragment的一个区别
当Activity进入后天后时,会被放到back stack中。这样当用户按Back键时,Activity可以恢复。但是,Fragment在进入后台时不会被自动放到back stack中。要实现这一目的,需要在Fragment处理期间显示调用addToBackStack()方法。
如:
FragmnetManangermanager=getFragmentManager();
FragmentTransactionfragmentTransaction=fragmentMananger.beginTransaction();
fragmentTransaction.replace(android.R.id.content,myfragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
这段代码确保了当Fragment添加到Activity中,用户可以点击Back按钮移除它
四、Intent调用系统应用,使用startActivity(intent)就可以跳转页面
1、 浏览器
Intent intent=new Intent(android.content.Intent.ACTION_VIEW,Uri.
parse(“http://www.baidu.com”));
选择器(可以不要)
startAtivity(Intent.createChooser(intent,”selectBrower..”));
2、 拨打电话
Intent intent=newIntent(android.content.Intent.ACTION_DIAL,Uri.
parse(“tel:+3444444”));
如果想让应用程序直接呼叫特定号码,需要为应用程序添加android.permission.CALL_PHONE权限。
只打开拨号应用程序:
Intent intent=newIntent(android.content.Intent.ACTION_DIAL);
3、 地图
Intent intent=newIntent(android.content.Intent.ACTION_VIEW,Uri.
parse(“geo:37.0,-122.0”));
4、 显示联系人列表
Intent intent=newIntent(android.content.Intent.ACTION_VIEW,Uri.
parse(“content://contacts”));
5、 选择联系人
Intent intent=newIntent(android.content.Intent.ACTION_PICK,Uri.
parse(“content://contacts”));
android.content.Intent.ACTION_VIEW常量实际上指的是“android.intent.action.VIEW”动作,所以还可以这样写,如选择联系人:
Intent intent=new Intent(“android.intent.action.VIEW”, Uri.
parse(“content://contacts”));
还可以这样写:
Intent intent=new Intent(“android.intent.action.VIEW”);
intent.setData( Uri.parse(“content://contacts”));
五、启动Activity
1、常规方法
Intent intent=new Intent(this,OtherActivity.class);
startActivity(intent);
2、使用action启动
在manifest.xml中Activity声明的时候,设置action
<activity
android:label=”OtherActivity”
android:name=”com.example.OtherActivity”
>
<Intent-filter>
<action android:name=”raleigh.OtherActivity”/>//最好使用包路径做action
. <category android:name=”android.intent.category.DEFAULT”/>
</intent-filter>
</activity>
启动Activity
Intent intent=new Intent(”raleigh.OtherActivity”);
startActivity(intent);
六、GroupView视图组
1、 LinearLayout
2、 AbsoluteLayout
3、 TableLayout
4、 RelativeLayout
5、 FrameLayout
6、 ScrollView
使用绝对布局AbsoluteLayout时可以结合layout_x和layout_y使用,指定View控件的位置。
七、获取焦点问题
1、 某控件获取焦点,加下面两句就可以获取了
android:focusable=”true”
android:focusableInTouchMode=”true”
2、 使EditText自动获取焦点,但不弹出虚拟键盘
需要在manifest.xml文件中,声明Activity时设置stateHidden,如
<activity
android:name=”.MainActivity”
android:windowSoftInputMode=”stateHidden”
>
</activity>
八、横竖屏切换
(一) 适应显示方向
1、锚定
使用RelativeLayout调整拉伸屏幕
2、调整大小和重新定位
使用两个布局,(layout-land)一个横向布局,(layout)一个纵向布局
(二) 配置改变是保持状态信息
1、 onPause()—当一个Activity被终止或转入后台时都会触发
2、 onSaveInstanceState()—当一个Activity将要被终止或转入后台时触发
与Pause()方法不同的是,当一个Activity从栈中卸载时(例如用户按下了Back按钮),不会触发onSaveInstanceState(),这是因为后面无需恢复其状态了。
例子,保存:
@Override
protected void onSaveInstanceState(BundleoutState) {
//注意super的顺序
outState.putString("ID","1234");
super.onSaveInstanceState(outState);
}
onRestoreInstanceState方法取出:
@Override
protected void onRestoreInstanceState(BundlesavedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
StringID=savedInstanceState.getString("ID");
}
3、 onRetainNonConfigurationInstance()—当一个Activity由于配置改变(例如横竖屏切换、键盘是否可用等),将要被销毁时触发。
当需要临时保存一些数据,例如从Web服务中下载了数据,而用户改变了屏幕的方向时,可以使用这个方法保存数据。
保存,可以返回任何对象:
@Override
public ObjectonRetainNonConfigurationInstance() {
String result="some text topreserve";
returnresult;
}
读取数据:
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
String str=(String)getLastNonConfigurationInstance();
}
(三) 检查方向的改变
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WindowManagerwm=getWindowManager();
// getDefaultDisplay()方法返回一个表示设备屏幕的Display对象
Displayd=wm.getDefaultDisplay();
if(d.getWidth()>d.getHeight()){
//landscape mode
}else{
//portraitmode
}
}
(四) 控制Activity的方向,设置横竖屏方向
1、代码设置,在onCreate()方法中:
横向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
纵向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
3、 在manifest.xml中设置(portrait纵向,landscape横向)
<activity
android:name="com.example.test.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<!-- 或者android:screenOrientation="landscape" -->
</activity>
九、Action Bar(支持Android 3.0以上)
(一) 打开或隐藏ActionBar
1、隐藏ActionBar,可以在manifest.xml中设置,还可以在代码中设置 actionBar.hide();
<activity
android:label="@string/app_name"
android:name=".MyActionBarActivity"
android:theme="@android:style/Theme.Holo.NoActionBar"
/>
2、打开ActionBar,代码设置
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar=getActionBar();
//隐藏 actionBar.hide();
actionBar.show();//打开
}
注意,此时manifest.xml中的android:theme不能设置值,否则会报null
(二) 定制动作项和应用程序图标
1、 定制动作项
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
说明:
a) MenuItem.SHOW_AS_ACTION_IF_ROOM如果Action Bar上有空间,将该菜单项显示为一个动作项,显示的菜单项没有文本。
b) (MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_WITH_TEXT)动作项同时显示图标和文本。
2、 ActionBar为了使应用程序图标可被点击,需要调用setDisplayHomeAsUpEnabled()方法:
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar=getActionBar();
// actionBar.hide();
actionBar.show();//显示Action Bar
//为了使应用程序图标可被点击,需要调用setDisplayHomeAsUpEnabled()方法
actionBar.setDisplayHomeAsUpEnabled(true);
}
监听:
@Override
public boolean onOptionsItemSelected(MenuItemitem) {
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this,"Youclicked on the Application icon", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
(三)
十、Intent Flag
1、Intent.FLAG_ACTIVITY_CLEAR_TOP:确保了当用户点击Action Bar中的应用程序图标时,Backstack中的一系列活动被清除,这样,如果用户点击Back按钮,应用程序中的其他活动就不会再次显示
十一、 菜单
1、 为某菜单项设置快捷键方法:
menu.setQwertyMode(true);
menuItem.setAlphabeticShortcut()
2、 将某个View与上下文菜单绑定:view.setOnCreateContextMenuListener(this);
十二、 时间视图,显示系统时间,不可更改
1、 AnalogClock有分针和时针
<AnaglogClock
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
/>
2、 DigitalClock数字显示时间
<DigitalClock
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
/>
十三、 WebView
1、 避免页面免重定向,需实现WebViewClient类并重写shouldOverrideUrlLoading()方法。
class Callback extends WebViewClient{
@override
public boolean shouldOverrideUrlLoading(WebView view,Stringurl){
return(false);
}
}
webview.setWebViewClient(new Callback());
2、 创建HTML字符串,loadDataWithBaseURL()
String mimeType=”text/html”;
String encoding=”UTF-8”;
String html=”<h1>A simple HTMLpage</h1><body><p>lazy dog</p></body>”
webView.loadDataWithBaseURL(“”,html,mimeType,encoding,””);
十四、 Content Provider
1、 查询字符串
a) content://media/internal/images 返回一个一个存储在设备上的返回内部图像的列表
b) content://media/external/images 返回一个存储在设备的外部存储器(如SD卡)上的所有图像的列表
c) content://call_log/calls 返回一个在CallLog中记录所有通话的列表
d) content://brower/bookmarks 返回一个存储在浏览器中的书签列表
2、 检测当前运行应用程序的版本
android.os.Build.VERSION.SDK_INT---取值范围(3-19)
3、 预定义查询字符串常量
Contacts.CONTENT_URI
Browser.BOOKMARKS_URI
Browser.SEARCHES_URI
CallLog.CONTENT_URI
MediaStore.image.Media.INTERNAL_CONTENT_URI
MediaStore.image.Media.EXTERNAL_CONTENT_URI
Settings.CONTENT_URI
4、 其他
1) 查询联系人
UriallContacts=Uri.parse("content://contacts/people");
或者:
Uri allContacts=ContactsContract.Contacts.CONTENT_URI;
说明:对于Android2.0或更高版本,需要使用Contacts.CONTENT_URI的方式,CONTENT_URI用来查询基本的Contacts记录。
2) 检索第一个联系人
Uri allContacts=Uri.parse("content://contacts/people/1");
或者
Uri allContacts=ContactsUris.widthAppendedId
(ContactsContract.Contacts.CONTENT_URI,1);
3) 遍历联系人
private void printContacts(Cursor c){
if(c.moveToFirst()){
do{
StringcontactId=c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
StringcontactDisplayName=c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Log.v("ContentProviders",contactId+","+contactDisplayName);
//为了访问一个联系人的号码,需要对存储于
//ContactsContract.ConmmonDataKinds.Phone.CONTENT_URI中的URI进行查询
inthasPhone=c.getInt(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if(hasPhone==1){
Cursor phoneCursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"= "+contactId, null,null);
while(phoneCursor.moveToNext()){
Log.v("Content Providersphone=",phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
phoneCursor.close();
}
}while(c.moveToNext());
}
}
5、 检索一个托管游标
managedQuery(uri, projection, selection, selectionArgs,sortOrder);
a) uri
如:Uri allContacts=ContactsContract.Contacts.CONTENT_URI;
b) 投影
如:String[]projection=new String[]{
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER
};
c) 筛选
String selection=ContactsContract.Contacts.DISPLAY_NAME+"LIKE '%Lin'";
筛选条件,前后结合使用
String selection=ContactsContract.Contacts.DISPLAY_NAME+" LIKE ?";
String[] selectionArgs=newString{“%Lin”};
d) 排序
String sortOrder =ContactsContract.Contacts.DISPLAY_NAME+"ASC
十五、 SMS
1、 发消息
SmsManager sms=SmsManager.getDefault();
sms.sendTextMessage(destinationAddress,scAddress, text, sentIntent, deliveryIntent);
说明:
a) destinationAddress—收件人的电话号码
b) scAddress—服务中心地址,null代表默认的SMSC
c) text—SMS消息的内容
d) sentIntent—发送消息后调用的挂起的Intent,可以为null
e) deliveryIntent—消息递送后调用的挂起的Intent,可以为null
注意,如果使用SmsManager类以编程的方式发送SMS消息,发送的消息不会出现在发送者的内置Messaging应用程序中
十六、 常用快捷键
1. Ctrl+Shift+O 导入该类所需要的所有包
2. Alt+/ 打开提示
3. Ctrl+Shift+Enter 上一行空行
4. Shift+Enter 下一行空行
5. Ctrl+Shift+G 查找调用某方法/对象/类的代码行
6. Ctrl+Shift+R 查找资源(需双击资源名,如查找layout)
7. Shift+Alt+R 重命名,方法名/对象名/类名/资源名
8. Ctrl+/ 注释某行
9. Shif+Alt+J 为某方法写注解