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 為某方法寫注解