Android开发小知识点

jopen 10年前

一、隐藏活动标题

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  为某方法写注解