android 屏幕图标尺寸规范

1. 程序启动图标:

ldpi (120 dpi)
小屏

mdpi (160 dpi)
中屏

hdpi (240 dpi)
大屏

xhdpi (320 dpi)
特大屏

36 x 36 px

48 x 48 px

72 x 72 px

96 x 96 px

 

ICON圆角半径

iTunes Artwork icon ───────────────────────── 512px (90px)
App icon(iPhone4) ────────────────────────── 114px (20px)
App icon(iPad) ───────────────────────────── 72px (12px)
App icon(iPhone 3G/3GS) ───────────────────── 57px(10px)
Spotlight/Settings icon icon(iPhone4) ───────────── 58px (10px)
Spotlight/Settings icon icon(iPhone 3G/3GS/iPad) ──── 29px (9px)

 

android中的dialog

在Android开发中,我们经常需要在界面上弹出一些对话框,比如询问用户或者让用户选择。 下面总结了下dialog的一些样式。

 

1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。

创建dialog对话框方法代码如下:

  1. protected void dialog() {
  2.     AlertDialog.Builder builder = new Builder(Main.this);
  3.     builder.setMessage(“确认退出吗?”);
  4.     builder.setTitle(“提示”);
  5.     builder.setPositiveButton(“确认”, new OnClickListener() {
  6.      @Override
  7.      public void onClick(DialogInterface dialog, int which) {
  8.       dialog.dismiss();
  9.       Main.this.finish();
  10.      }
  11.     });
  12.     builder.setNegativeButton(“取消”, new OnClickListener() {
  13.      @Override
  14.      public void onClick(DialogInterface dialog, int which) {
  15.       dialog.dismiss();
  16.      }
  17.     });
  18.     builder.create().show();
  19.    }

在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法

  1. public boolean onKeyDown(int keyCode, KeyEvent event) {
  2.     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
  3.      dialog();
  4.     }
  5.     return false;
  6.    }

2.改变了对话框的图表,添加了三个按钮

创建dialog的方法代码如下:

  1. Dialog dialog = new AlertDialog.Builder(this).setIcon(
  2.        android.R.drawable.btn_star).setTitle(“喜好调查”).setMessage(
  3.        “你喜欢李连杰的电影吗?”).setPositiveButton(“很喜欢”,
  4.        new OnClickListener() {
  5.         @Override
  6.         public void onClick(DialogInterface dialog, int which) {
  7.          // TODO Auto-generated method stub
  8.          Toast.makeText(Main.this, “我很喜欢他的电影。”,
  9.            Toast.LENGTH_LONG).show();
  10.         }
  11.        }).setNegativeButton(“不喜欢”, new OnClickListener() {
  12.       @Override
  13.       public void onClick(DialogInterface dialog, int which) {
  14.        // TODO Auto-generated method stub
  15.        Toast.makeText(Main.this, “我不喜欢他的电影。”, Toast.LENGTH_LONG)
  16.          .show();
  17.       }
  18.      }).setNeutralButton(“一般”, new OnClickListener() {
  19.       @Override
  20.       public void onClick(DialogInterface dialog, int which) {
  21.        // TODO Auto-generated method stub
  22.        Toast.makeText(Main.this, “谈不上喜欢不喜欢。”, Toast.LENGTH_LONG)
  23.          .show();
  24.       }
  25.      }).create();
  26.      dialog.show();

3.信息内容是一个简单的View类型

创建dialog方法的代码如下:

  1. new AlertDialog.Builder(this).setTitle(“请输入”).setIcon(
  2.        android.R.drawable.ic_dialog_info).setView(
  3.        new EditText(this)).setPositiveButton(“确定”, null)
  4.        .setNegativeButton(“取消”, null).show();

4.信息内容是一组单选框

创建dialog方法的代码如下:

  1. new AlertDialog.Builder(this).setTitle(“单选框”).setIcon(
  2.        android.R.drawable.ic_dialog_info).setSingleChoiceItems(
  3.        new String[] { “Item1”, “Item2” }, 0,
  4.        new DialogInterface.OnClickListener() {
  5.         public void onClick(DialogInterface dialog, int which) {
  6.          dialog.dismiss();
  7.         }
  8.        }).setNegativeButton(“取消”, null).show();

 

5.信息内容是一组多选框

创建dialog方法的代码如下:

  1. new AlertDialog.Builder(this).setTitle(“复选框”).setMultiChoiceItems(
  2.        new String[] { “Item1”, “Item2” }, null, null)
  3.        .setPositiveButton(“确定”, null)
  4.        .setNegativeButton(“取消”, null).show();

6.信息内容是一组简单列表项

创建dialog的方法代码如下:

  1. new AlertDialog.Builder(this).setTitle(“列表框”).setItems(
  2.        new String[] { “Item1”, “Item2” }, null).setNegativeButton(
  3.        “确定”, null).show();

7.信息内容是一个自定义的布局

dialog布局文件代码如下:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2.   <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3.    android:layout_height=”wrap_content” android:layout_width=”wrap_content”
  4.    android:background=”#ffffffff” android:orientation=”horizontal”
  5.    android:id=”@+id/dialog”>
  6.    <TextView android:layout_height=”wrap_content”
  7.      android:layout_width=”wrap_content”
  8.     android:id=”@+id/tvname” android:text=”姓名:” />
  9.    <EditText android:layout_height=”wrap_content”
  10.     android:layout_width=”wrap_content” android:id=”@+id/etname” android:minWidth=”100dip”/>
  11.   </LinearLayout>

创建dialog方法的代码如下:

  1. LayoutInflater inflater = getLayoutInflater();
  2.      View layout = inflater.inflate(R.layout.dialog,
  3.        (ViewGroup) findViewById(R.id.dialog));
  4.      new AlertDialog.Builder(this).setTitle(“自定义布局”).setView(layout)
  5.        .setPositiveButton(“确定”, null)
  6.        .setNegativeButton(“取消”, null).show();

 

好了,以上7种Android dialog对话框的使用方法就介绍到这里了,基本都全了,如果大家在android开发过程中遇到dialog的时候就可以拿出来看看。

android 调用系统设置界面

在编写android应用程序时,如果需要调用系统原生的管理应用程序界面呢?本人在一个项目中遇到过,本人没有发现这方面现成的intent,不过通过看源代码实现了。

android源代码application_settings.xml

  1. <PreferenceScreen  

  2.           android:title="@string/manageapplications_settings_title"  

  3.           android:summary="@string/manageapplications_settings_summary">  

  4.       <intent android:action="android.intent.action.MAIN"  

  5.               android:targetPackage="com.android.settings"  

  6.               android:targetClass="com.android.settings.ManageApplications" />  

  7.   </PreferenceScreen>  


熟悉PreferenceScreen的朋友应该知道如何做了,如果不熟悉的朋友,文章最后贴出一篇文章,大家参考一下就知道了,根据xml的描述,我们可以用如下代码调用系统原生的管理应用程序界面

  1. Intent intent =  new Intent();  

  2. intent.setAction("android.intent.action.MAIN");  

  3. intent.setClassName("com.android.settings", "com.android.settings.ManageApplications");  

  4. startActivity(intent);  

如果要进入某个软件详细设置界面 可以如下操作:  

“Android系统设置->应用程序->管理应用程序”列表下,列出了系统已安装的应用程序。选择其中一个程序,则进入“应用程序信息(Application Info)”界面。这个界面显示了程序名称、版本、存储、权限等信息,并有卸载、停止、清除缓存等按钮,可谓功能不少。如果在编写相关程序时(比如任务管理器)可以调用这个面板,自然提供了很大的方便。那么如何实现呢?

在最新的Android SDK 2.3(API Level 9)中,提供了这样的接口。在文档路径

docs/reference/android/provider/Settings.html#ACTION_APPLICATION_DETAILS_SETTINGS

下,有这样的描述:

public static final String ACTION_APPLICATION_DETAILS_SETTINGS    Since: API Level 9

Activity Action: Show screen of details about a particular application.
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
Input: The Intent's data URI specifies the application package name to be shown, with the "package" scheme. That is "package:com.my.app".
Output: Nothing.
Constant Value: "android.settings.APPLICATION_DETAILS_SETTINGS"

就是说,我们只要以android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS作为Action;package:应用程序的包名作为URI,就可以用startActivity启动应用程序信息界面了。代码如下:

  1. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  

  2. Uri uri = Uri.fromParts(SCHEME, packageName, null);  

  3. intent.setData(uri);  

  4. startActivity(intent);  

但是,在Android 2.3之前的版本,并没有公开相关的接口。
通过查看系统设置platform/packages/apps/Settings.git程序的源码,可以发现应用程序信息界面为InstalledAppDetails。
这里(2.1)还有这里(2.2),我们可以分别看到Android2.1Android2.2的应用管理程序(ManageApplications.java)是如何启动InstalledAppDetails的。
  1. // utility method used to start sub activity  

  2. private void startApplicationDetailsActivity() {  

  3.    // Create intent to start new activity  

  4.    Intent intent = new Intent(Intent.ACTION_VIEW);  

  5.    intent.setClass(this, InstalledAppDetails.class);  

  6.    intent.putExtra(APP_PKG_NAME, mCurrentPkgName);  

  7.    // start new activity to display extended information  

  8.    startActivityForResult(intent, INSTALLED_APP_DETAILS);  

  9. }  

但是常量APP_PKG_NAME的定义并不相同。
2.2中定义为"pkg",2.1中定义为"com.android.settings.ApplicationPkgName"
那么,对于2.1及以下版本,我们可以这样调用InstalledAppDetails:
  1. Intent i = new Intent(Intent.ACTION_VIEW);                  

  2. i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");  

  3. i.putExtra("com.android.settings.ApplicationPkgName", packageName);  

  4. startActivity(i);  

对于2.2,只需替换上面putExtra的第一个参数为"pkg"
综上,通用的调用“应用程序信息”的代码如下:
  1. private static final String SCHEME = "package";  

  2. /**

  3. * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)

  4. */  

  5. private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";  

  6. /**

  7. * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)

  8. */  

  9. private static final String APP_PKG_NAME_22 = "pkg";  

  10. /**

  11. * InstalledAppDetails所在包名

  12. */  

  13. private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";  

  14. /**

  15. * InstalledAppDetails类名

  16. */  

  17. private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";  

  18. /**

  19. * 调用系统InstalledAppDetails界面显示已安装应用程序的详细信息。 对于Android 2.3(Api Level

  20. * 9)以上,使用SDK提供的接口; 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)。

  21. *

  22. * @param context

  23. *

  24. * @param packageName

  25. *            应用程序的包名

  26. */  

  27. public static void showInstalledAppDetails(Context context, String packageName) {  

  28.    Intent intent = new Intent();  

  29.    final int apiLevel = Build.VERSION.SDK_INT;  

  30.    if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口  

  31.        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  

  32.        Uri uri = Uri.fromParts(SCHEME, packageName, null);  

  33.        intent.setData(uri);  

  34.    } else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)  

  35.        // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。  

  36.        final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22  

  37.                : APP_PKG_NAME_21);  

  38.        intent.setAction(Intent.ACTION_VIEW);  

  39.        intent.setClassName(APP_DETAILS_PACKAGE_NAME,  

  40.                APP_DETAILS_CLASS_NAME);  

  41.        intent.putExtra(appPkgName, packageName);  

  42.    }  

  43.    context.startActivity(intent);  

  44. }  

android中 TextView设置滚动条

TextView实现滚动的三种方式:

1、嵌套在ScrollView或者HorizontalScrollView中

垂直滚动:
<scrollview android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:scrollbars="vertical">
   <textview android:text="http://orgcent.com …"/>
</scrollview>

水平滚动:使用标签<horizontalscrollview></horizontalscrollview>

一定要注意的是 ScrollView要放到 textView外边  才能生效地 。  

2、设置ScrollingMovementMethod
代码中添加:

TextView.setMovementMethod(new ScrollingMovementMethod());

XML中配置:

android:scrollbars="vertical"

特别要注意 2条件同时满足才能效。    

3、使用Scroller来自定义TextView
点击查看:android自定义View-垂直滚动的TextView



如果需要删除TextView的 滚动条 可以 设置ScrollView 的xml的属性 android:scrollbars="none"



设计模式入门

策略模式:

设计模式原则一:

把问题归零,找出应用中可能需要变化之处,把它们独立出来,不要把它们和那些不需要变化的代码混在一起。

 

设计模式原则二:

针对接口编程,而不是针对实现编程.

就鸭子而言在父类中定义借口定义动作类去实现接口 ,如果要某种动作,创建动作类实现该动作 ,new 那个动作然后 给父类,可以以在子类的构造函数中定义该行为具体方法。 这样保证我让橡皮鸭子可以拥有火箭的动力。如果不想让它拥有火箭动力也可以去掉。

设计模式原则三:

多用组合少用继承,飞行和叫是通过适当的行为和对象组合而来的。别的非duck类的也可以有鸣叫的方法 其实就相当于把 借口当作成员 这是我理解中的委托。