动态设置全屏、取消全屏的方法,以及切换全屏保持内容位置不变的方法

时间:2016-12-23   作者:   分类: Android   热度:28°  评论:0  
时间:2016-12-23   分类: Android    热度:28   评论:0

有两种形式设置、取消全屏的方法,之所以称作两种形式而不是两种方法,是因为这两种方式只是写法不同,实质是一样的。


形式一:

//设置全屏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

//取消全屏

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);


形式二:

//设置全屏

WindowManager.LayoutParams attr = getWindow().getAttributes();
attr.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attr);

//取消全屏

WindowManager.LayoutParams attr = getWindow().getAttributes();
attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attr);



全屏状态改为非全屏保持内容位置不变:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);


这里有一个问题:

当设置了该flag之后取消全屏,部分内容被状态栏挡住(忽略状态栏高度,以屏幕右上角为原点计算布局)

加上代码getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);可以解决该问题,但再次设置全屏的时候状态栏不消失。

startActivityForResult和setResult

时间:2016-10-27   作者:   分类: Android   热度:114°  评论:0  
时间:2016-10-27   分类: Android    热度:114   评论:0

startActivityForResult与startActivity的不同之处在于:
1. startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2. startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个 Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的 onActivityResult( )方法。

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

简单例子介绍:

1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)

Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle();
String str1="aaaaaa";
bundle.putString("str1", str1);
intent.putExtras(bundle);
startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0

2.重写onActivityResult方法,用来接收B回传的数据。

protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK case RESULT_OK:
    Bundle b=data.getExtras(); //data为B中回传的Intent String str=b.getString("str1");//str即为回传的值 break; default: break;
    }
}

3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundle
finish();//此处一定要调用finish()方法

Android activity的setResult()在什么时候调用(重点也是难点)

如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的 Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
看一下源码就明白了:

public final void setResult(int resultCode, Intent data) { synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }
    } public void finish() { if (mParent == null) { int resultCode;
            Intent resultData; synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            } if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken); try { if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData)) {
                    mFinished = true;
                }
            } catch (RemoteException e) { // Empty }
        } else {
            mParent.finishFromChild(this);
        }
    }

这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了

@Override public void onBackPressed() {
        Log.i(TAG, "onBackPressed");
        setResult(Const.LIVE_OK); super.onBackPressed();
    }

当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.

Android Fragment使用碎片实现底部按钮Tab

时间:2016-9-13   作者:   分类: Android   热度:86°  评论:0  
时间:2016-9-13   分类: Android    热度:86   评论:0

出处:http://blog.csdn.net/guolin_blog/article/details/8881711

源码地址:http://pan.baidu.com/s/1pKA7gBx

现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上,也有很多的场景可以运用到Fragment了,今天我们就来学习其中一个特别棒的应用技巧。

很多手机应用都会有一个非常类似的功能,即屏幕的下方显示一行Tab标签选项,点击不同的标签就可以切换到不同的界面,如以下几个应用所示:

                     

上面三个应用从左到右分别是QQ、新浪微博和支付宝钱包,可见,这种底部标签式的布局策略真的非常常见。

那么话说回来,这种效果到底是如何的呢?熟悉Android的朋友一定都会知道,很简单嘛,使用TabHost就OK了!但是殊不知,TabHost并非是那么的简单,它的可扩展性非常的差,不能随意地定制Tab项显示的内容,而且运行还要依赖于ActivityGroup。ActivityGroup原本主要是用于为每一个TabHost的子项管理一个单独的Activity,但目前已经被废弃了。为什么呢?当然就是因为Fragment的出现了!查看Android官方文档中ActivityGroup的描述,如下所示:

        

可以看到,在API 13的时候Android就已经将ActivityGroup废弃掉了,并且官方推荐的替代方式就是使用Fragment,因为它使用起来更加的灵活。那么剩下的问题就是如何借助Fragment来完成类似于TabHost一般的效果了,因此我们自然要动起手来了。

另外,我们还应该准备好程序所需要的资源,比如说每一个Tab项中所用到的图片。我已经事先从QQ里截好了几张图作为这个项目的资源,稍后会连同源码一起给出。

新建一个项目,起名就叫FragmentDemo,这里我使用的是4.0的API。

下面开始编程工作,这里我们首先需要去编写一个类似于QQ的主界面,当然只会去编写界面最下方的TabHost部分,而不会编写上面的内容界面部分,因为内容界面是应该写在Fragment的布局里的。打开或新建activity_main.xml作为程序的主布局文件,在里面加入如下代码:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <FrameLayout  
  7.         android:id="@+id/content"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="0dp"  
  10.         android:layout_weight="1" >  
  11.     </FrameLayout>  
  12.   
  13.     <LinearLayout  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="60dp"  
  16.         android:background="@drawable/tab_bg" >  
  17.   
  18.         <RelativeLayout  
  19.             android:id="@+id/message_layout"  
  20.             android:layout_width="0dp"  
  21.             android:layout_height="match_parent"  
  22.             android:layout_weight="1" >  
  23.   
  24.             <LinearLayout  
  25.                 android:layout_width="match_parent"  
  26.                 android:layout_height="wrap_content"  
  27.                 android:layout_centerVertical="true"  
  28.                 android:orientation="vertical" >  
  29.   
  30.                 <ImageView  
  31.                     android:id="@+id/message_image"  
  32.                     android:layout_width="wrap_content"  
  33.                     android:layout_height="wrap_content"  
  34.                     android:layout_gravity="center_horizontal"  
  35.                     android:src="@drawable/message_unselected" />  
  36.   
  37.                 <TextView  
  38.                     android:id="@+id/message_text"  
  39.                     android:layout_width="wrap_content"  
  40.                     android:layout_height="wrap_content"  
  41.                     android:layout_gravity="center_horizontal"  
  42.                     android:text="消息"  
  43.                     android:textColor="#82858b" />  
  44.             </LinearLayout>  
  45.         </RelativeLayout>  
  46.   
  47.         <RelativeLayout  
  48.             android:id="@+id/contacts_layout"  
  49.             android:layout_width="0dp"  
  50.             android:layout_height="match_parent"  
  51.             android:layout_weight="1" >  
  52.   
  53.             <LinearLayout  
  54.                 android:layout_width="match_parent"  
  55.                 android:layout_height="wrap_content"  
  56.                 android:layout_centerVertical="true"  
  57.                 android:orientation="vertical" >  
  58.   
  59.                 <ImageView  
  60.                     android:id="@+id/contacts_image"  
  61.                     android:layout_width="wrap_content"  
  62.                     android:layout_height="wrap_content"  
  63.                     android:layout_gravity="center_horizontal"  
  64.                     android:src="@drawable/contacts_unselected" />  
  65.   
  66.                 <TextView  
  67.                     android:id="@+id/contacts_text"  
  68.                     android:layout_width="wrap_content"  
  69.                     android:layout_height="wrap_content"  
  70.                     android:layout_gravity="center_horizontal"  
  71.                     android:text="联系人"  
  72.                     android:textColor="#82858b" />  
  73.             </LinearLayout>  
  74.         </RelativeLayout>  
  75.   
  76.         <RelativeLayout  
  77.             android:id="@+id/news_layout"  
  78.             android:layout_width="0dp"  
  79.             android:layout_height="match_parent"  
  80.             android:layout_weight="1" >  
  81.   
  82.             <LinearLayout  
  83.                 android:layout_width="match_parent"  
  84.                 android:layout_height="wrap_content"  
  85.                 android:layout_centerVertical="true"  
  86.                 android:orientation="vertical" >  
  87.   
  88.                 <ImageView  
  89.                     android:id="@+id/news_image"  
  90.                     android:layout_width="wrap_content"  
  91.                     android:layout_height="wrap_content"  
  92.                     android:layout_gravity="center_horizontal"  
  93.                     android:src="@drawable/news_unselected" />  
  94.   
  95.                 <TextView  
  96.                     android:id="@+id/news_text"  
  97.                     android:layout_width="wrap_content"  
  98.                     android:layout_height="wrap_content"  
  99.                     android:layout_gravity="center_horizontal"  
  100.                     android:text="动态"  
  101.                     android:textColor="#82858b" />  
  102.             </LinearLayout>  
  103.         </RelativeLayout>  
  104.   
  105.         <RelativeLayout  
  106.             android:id="@+id/setting_layout"  
  107.             android:layout_width="0dp"  
  108.             android:layout_height="match_parent"  
  109.             android:layout_weight="1" >  
  110.   
  111.             <LinearLayout  
  112.                 android:layout_width="match_parent"  
  113.                 android:layout_height="wrap_content"  
  114.                 android:layout_centerVertical="true"  
  115.                 android:orientation="vertical" >  
  116.   
  117.                 <ImageView  
  118.                     android:id="@+id/setting_image"  
  119.                     android:layout_width="wrap_content"  
  120.                     android:layout_height="wrap_content"  
  121.                     android:layout_gravity="center_horizontal"  
  122.                     android:src="@drawable/setting_unselected" />  
  123.   
  124.                 <TextView  
  125.                     android:id="@+id/setting_text"  
  126.                     android:layout_width="wrap_content"  
  127.                     android:layout_height="wrap_content"  
  128.                     android:layout_gravity="center_horizontal"  
  129.                     android:text="设置"  
  130.                     android:textColor="#82858b" />  
  131.             </LinearLayout>  
  132.         </RelativeLayout>  
  133.     </LinearLayout>  
  134.   
  135. </LinearLayout>  

这段布局代码虽然有点长,但其实主要就分为两部分。第一个部分就是FrameLayout,这里只是给FrameLayout的id设置成content,并没有在里面添加任何具体的内容,因为具体的内容是要在后面动态进行添加的。第二个部分就是FrameLayout下面的LinearLayout,这个LinearLayout中包含的就是整个类似于TabHost的布局。可以看到,我们将这个LinearLayout又等分成了四份,每一份中都会显示一个ImageView和一个TextView。ImageView用于显示当前Tab的图标,TextView用于显示当前Tab的标题,这个效果就会和QQ非常得类似。

既然是等分成了四分,那接下来我们自然要去分别实现四个Fragment和它们的布局了。新建一个message_layout.xml作为消息界面的布局,代码如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_centerInParent="true"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <ImageView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:layout_gravity="center_horizontal"  
  16.             android:src="@drawable/message_selected" />  
  17.   
  18.         <TextView  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:layout_gravity="center_horizontal"  
  22.             android:padding="10dp"  
  23.             android:text="这是消息界面"  
  24.             android:textSize="20sp" />  
  25.     </LinearLayout>  
  26.   
  27. </RelativeLayout>  

这个布局就相对简单多了,只是在屏幕的正中央显示一个消息图标,以及一段文字。

然后要去创建对应这个布局的Fragment。新建MessageFragment继承自Fragment,代码如下所示:

  1. public class MessageFragment extends Fragment {  
  2.   
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.         View messageLayout = inflater.inflate(R.layout.message_layout, container, false);  
  6.         return messageLayout;  
  7.     }  
  8.   
  9. }  

后面就是依葫芦画瓢,把其它几个Fragment以及对应的布局创建出来。新建contacts_layout.xml作为联系人界面的布局,代码如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_centerInParent="true"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <ImageView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:layout_gravity="center_horizontal"  
  16.             android:src="@drawable/contacts_selected" />  
  17.   
  18.         <TextView  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:layout_gravity="center_horizontal"  
  22.             android:padding="10dp"  
  23.             android:text="这是联系人界面"  
  24.             android:textSize="20sp" />  
  25.     </LinearLayout>  
  26.   
  27. </RelativeLayout>  

再新建ContactsFragment继承自Fragment,代码如下所示:

  1. public class ContactsFragment extends Fragment {  
  2.   
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  5.             Bundle savedInstanceState) {  
  6.         View contactsLayout = inflater.inflate(R.layout.contacts_layout,  
  7.                 container, false);  
  8.         return contactsLayout;  
  9.     }  
  10.   
  11. }  

然后新建news_layout.xml作为动态界面的布局,代码如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_centerInParent="true"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <ImageView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:layout_gravity="center_horizontal"  
  16.             android:src="@drawable/news_selected" />  
  17.   
  18.         <TextView  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:layout_gravity="center_horizontal"  
  22.             android:padding="10dp"  
  23.             android:text="这是动态界面"  
  24.             android:textSize="20sp" />  
  25.     </LinearLayout>  
  26.   
  27. </RelativeLayout>  

再新建NewsFragment继承自Fragment,代码如下所示:

  1. public class NewsFragment extends Fragment {  
  2.   
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  5.             Bundle savedInstanceState) {  
  6.         View newsLayout = inflater.inflate(R.layout.news_layout, container,  
  7.                 false);  
  8.         return newsLayout;  
  9.     }  
  10.   
  11. }  

最后新建setting_layout.xml作为设置界面的布局,代码如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <LinearLayout  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_centerInParent="true"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <ImageView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:layout_gravity="center_horizontal"  
  16.             android:src="@drawable/setting_selected" />  
  17.   
  18.         <TextView  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:layout_gravity="center_horizontal"  
  22.             android:padding="10dp"  
  23.             android:text="这是设置界面"  
  24.             android:textSize="20sp" />  
  25.     </LinearLayout>  
  26.   
  27. </RelativeLayout>  

再新建SettingFragment继承自Fragment,代码如下所示:

  1. public class SettingFragment extends Fragment {  
  2.   
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  5.             Bundle savedInstanceState) {  
  6.         View settingLayout = inflater.inflate(R.layout.setting_layout,  
  7.                 container, false);  
  8.         return settingLayout;  
  9.     }  
  10.   
  11. }  

这样我们就把每一个Fragment,以及它们所对应的布局文件都创建好了。接下来也就是最关键的步骤了,打开或新建MainActivity作为主Activity,代码如下所示:

  1. /** 
  2.  * 项目的主Activity,所有的Fragment都嵌入在这里。 
  3.  *  
  4.  * @author guolin 
  5.  */  
  6. public class MainActivity extends Activity implements OnClickListener {  
  7.   
  8.     /** 
  9.      * 用于展示消息的Fragment 
  10.      */  
  11.     private MessageFragment messageFragment;  
  12.   
  13.     /** 
  14.      * 用于展示联系人的Fragment 
  15.      */  
  16.     private ContactsFragment contactsFragment;  
  17.   
  18.     /** 
  19.      * 用于展示动态的Fragment 
  20.      */  
  21.     private NewsFragment newsFragment;  
  22.   
  23.     /** 
  24.      * 用于展示设置的Fragment 
  25.      */  
  26.     private SettingFragment settingFragment;  
  27.   
  28.     /** 
  29.      * 消息界面布局 
  30.      */  
  31.     private View messageLayout;  
  32.   
  33.     /** 
  34.      * 联系人界面布局 
  35.      */  
  36.     private View contactsLayout;  
  37.   
  38.     /** 
  39.      * 动态界面布局 
  40.      */  
  41.     private View newsLayout;  
  42.   
  43.     /** 
  44.      * 设置界面布局 
  45.      */  
  46.     private View settingLayout;  
  47.   
  48.     /** 
  49.      * 在Tab布局上显示消息图标的控件 
  50.      */  
  51.     private ImageView messageImage;  
  52.   
  53.     /** 
  54.      * 在Tab布局上显示联系人图标的控件 
  55.      */  
  56.     private ImageView contactsImage;  
  57.   
  58.     /** 
  59.      * 在Tab布局上显示动态图标的控件 
  60.      */  
  61.     private ImageView newsImage;  
  62.   
  63.     /** 
  64.      * 在Tab布局上显示设置图标的控件 
  65.      */  
  66.     private ImageView settingImage;  
  67.   
  68.     /** 
  69.      * 在Tab布局上显示消息标题的控件 
  70.      */  
  71.     private TextView messageText;  
  72.   
  73.     /** 
  74.      * 在Tab布局上显示联系人标题的控件 
  75.      */  
  76.     private TextView contactsText;  
  77.   
  78.     /** 
  79.      * 在Tab布局上显示动态标题的控件 
  80.      */  
  81.     private TextView newsText;  
  82.   
  83.     /** 
  84.      * 在Tab布局上显示设置标题的控件 
  85.      */  
  86.     private TextView settingText;  
  87.   
  88.     /** 
  89.      * 用于对Fragment进行管理 
  90.      */  
  91.     private FragmentManager fragmentManager;  
  92.   
  93.     @Override  
  94.     protected void onCreate(Bundle savedInstanceState) {  
  95.         super.onCreate(savedInstanceState);  
  96.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  97.         setContentView(R.layout.activity_main);  
  98.         // 初始化布局元素  
  99.         initViews();  
  100.         fragmentManager = getFragmentManager();  
  101.         // 第一次启动时选中第0个tab  
  102.         setTabSelection(0);  
  103.     }  
  104.   
  105.     /** 
  106.      * 在这里获取到每个需要用到的控件的实例,并给它们设置好必要的点击事件。 
  107.      */  
  108.     private void initViews() {  
  109.         messageLayout = findViewById(R.id.message_layout);  
  110.         contactsLayout = findViewById(R.id.contacts_layout);  
  111.         newsLayout = findViewById(R.id.news_layout);  
  112.         settingLayout = findViewById(R.id.setting_layout);  
  113.         messageImage = (ImageView) findViewById(R.id.message_image);  
  114.         contactsImage = (ImageView) findViewById(R.id.contacts_image);  
  115.         newsImage = (ImageView) findViewById(R.id.news_image);  
  116.         settingImage = (ImageView) findViewById(R.id.setting_image);  
  117.         messageText = (TextView) findViewById(R.id.message_text);  
  118.         contactsText = (TextView) findViewById(R.id.contacts_text);  
  119.         newsText = (TextView) findViewById(R.id.news_text);  
  120.         settingText = (TextView) findViewById(R.id.setting_text);  
  121.         messageLayout.setOnClickListener(this);  
  122.         contactsLayout.setOnClickListener(this);  
  123.         newsLayout.setOnClickListener(this);  
  124.         settingLayout.setOnClickListener(this);  
  125.     }  
  126.   
  127.     @Override  
  128.     public void onClick(View v) {  
  129.         switch (v.getId()) {  
  130.         case R.id.message_layout:  
  131.             // 当点击了消息tab时,选中第1个tab  
  132.             setTabSelection(0);  
  133.             break;  
  134.         case R.id.contacts_layout:  
  135.             // 当点击了联系人tab时,选中第2个tab  
  136.             setTabSelection(1);  
  137.             break;  
  138.         case R.id.news_layout:  
  139.             // 当点击了动态tab时,选中第3个tab  
  140.             setTabSelection(2);  
  141.             break;  
  142.         case R.id.setting_layout:  
  143.             // 当点击了设置tab时,选中第4个tab  
  144.             setTabSelection(3);  
  145.             break;  
  146.         default:  
  147.             break;  
  148.         }  
  149.     }  
  150.   
  151.     /** 
  152.      * 根据传入的index参数来设置选中的tab页。 
  153.      *  
  154.      * @param index 
  155.      *            每个tab页对应的下标。0表示消息,1表示联系人,2表示动态,3表示设置。 
  156.      */  
  157.     private void setTabSelection(int index) {  
  158.         // 每次选中之前先清楚掉上次的选中状态  
  159.         clearSelection();  
  160.         // 开启一个Fragment事务  
  161.         FragmentTransaction transaction = fragmentManager.beginTransaction();  
  162.         // 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况  
  163.         hideFragments(transaction);  
  164.         switch (index) {  
  165.         case 0:  
  166.             // 当点击了消息tab时,改变控件的图片和文字颜色  
  167.             messageImage.setImageResource(R.drawable.message_selected);  
  168.             messageText.setTextColor(Color.WHITE);  
  169.             if (messageFragment == null) {  
  170.                 // 如果MessageFragment为空,则创建一个并添加到界面上  
  171.                 messageFragment = new MessageFragment();  
  172.                 transaction.add(R.id.content, messageFragment);  
  173.             } else {  
  174.                 // 如果MessageFragment不为空,则直接将它显示出来  
  175.                 transaction.show(messageFragment);  
  176.             }  
  177.             break;  
  178.         case 1:  
  179.             // 当点击了联系人tab时,改变控件的图片和文字颜色  
  180.             contactsImage.setImageResource(R.drawable.contacts_selected);  
  181.             contactsText.setTextColor(Color.WHITE);  
  182.             if (contactsFragment == null) {  
  183.                 // 如果ContactsFragment为空,则创建一个并添加到界面上  
  184.                 contactsFragment = new ContactsFragment();  
  185.                 transaction.add(R.id.content, contactsFragment);  
  186.             } else {  
  187.                 // 如果ContactsFragment不为空,则直接将它显示出来  
  188.                 transaction.show(contactsFragment);  
  189.             }  
  190.             break;  
  191.         case 2:  
  192.             // 当点击了动态tab时,改变控件的图片和文字颜色  
  193.             newsImage.setImageResource(R.drawable.news_selected);  
  194.             newsText.setTextColor(Color.WHITE);  
  195.             if (newsFragment == null) {  
  196.                 // 如果NewsFragment为空,则创建一个并添加到界面上  
  197.                 newsFragment = new NewsFragment();  
  198.                 transaction.add(R.id.content, newsFragment);  
  199.             } else {  
  200.                 // 如果NewsFragment不为空,则直接将它显示出来  
  201.                 transaction.show(newsFragment);  
  202.             }  
  203.             break;  
  204.         case 3:  
  205.         default:  
  206.             // 当点击了设置tab时,改变控件的图片和文字颜色  
  207.             settingImage.setImageResource(R.drawable.setting_selected);  
  208.             settingText.setTextColor(Color.WHITE);  
  209.             if (settingFragment == null) {  
  210.                 // 如果SettingFragment为空,则创建一个并添加到界面上  
  211.                 settingFragment = new SettingFragment();  
  212.                 transaction.add(R.id.content, settingFragment);  
  213.             } else {  
  214.                 // 如果SettingFragment不为空,则直接将它显示出来  
  215.                 transaction.show(settingFragment);  
  216.             }  
  217.             break;  
  218.         }  
  219.         transaction.commit();  
  220.     }  
  221.   
  222.     /** 
  223.      * 清除掉所有的选中状态。 
  224.      */  
  225.     private void clearSelection() {  
  226.         messageImage.setImageResource(R.drawable.message_unselected);  
  227.         messageText.setTextColor(Color.parseColor("#82858b"));  
  228.         contactsImage.setImageResource(R.drawable.contacts_unselected);  
  229.         contactsText.setTextColor(Color.parseColor("#82858b"));  
  230.         newsImage.setImageResource(R.drawable.news_unselected);  
  231.         newsText.setTextColor(Color.parseColor("#82858b"));  
  232.         settingImage.setImageResource(R.drawable.setting_unselected);  
  233.         settingText.setTextColor(Color.parseColor("#82858b"));  
  234.     }  
  235.   
  236.     /** 
  237.      * 将所有的Fragment都置为隐藏状态。 
  238.      *  
  239.      * @param transaction 
  240.      *            用于对Fragment执行操作的事务 
  241.      */  
  242.     private void hideFragments(FragmentTransaction transaction) {  
  243.         if (messageFragment != null) {  
  244.             transaction.hide(messageFragment);  
  245.         }  
  246.         if (contactsFragment != null) {  
  247.             transaction.hide(contactsFragment);  
  248.         }  
  249.         if (newsFragment != null) {  
  250.             transaction.hide(newsFragment);  
  251.         }  
  252.         if (settingFragment != null) {  
  253.             transaction.hide(settingFragment);  
  254.         }  
  255.     }  
  256. }  

这个类中的注释已经写得非常详细了,下面我再带大家简单梳理一遍。在onCreate()方法中先是调用了initViews()来获取每个控件的实例,并给相应的控件设置好点击事件,然后调用setTabSelection()方法设置默认的选中项,这里传入的0说明默认选中第1个Tab项。

那么setTabSelection()方法中又是如何处理的呢?可以看到,首先第一步是调用clearSelection()方法来清理掉之前的选中状态,然后开启一个Fragment事务,并隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上。接下来根据传入的index参数判断出选中的是哪一个Tab项,并改变该Tab项的图标和文字颜色,然后将相应的Fragment添加到界面上。这里注意一个细节,我们添加Fragment的时候并没有使用replace()方法,而是会先判断一下该Fragment是否为空,如果是空的则调用add()方法添加一个进来,如果不是空的则直接调用show()方法显示出来即可。那么为什么没有使用replace()方法呢?这是因为replace()方法会将被替换掉的那个Fragment彻底地移除掉,该Fragment的生命周期就结束了。当再次点击刚才那个Tab项的时候,就会让该Fragment的生命周期重新开始,onCreate()、onCreateView()等方法都会重新执行一遍。这显然不是我们想要的,也和ActivityGroup的工作原理不符,因此最好的解决方案就是使用hide()和show()方法来隐藏和显示Fragment,这就不会让Fragment的生命周期重走一遍了。

设置完默认选中项后,我们当然还可以通过点击Tab项来自由地切换界面,这就会进入到onClick()方法中。onClick()方法中的逻辑判断非常简单,当点击了消息标签时就会选中第1个tab项,点击联系人标签时就会选中第2个tab项,点击动态标签时就会选中第3个tab项,点击设置标签时就会选中第4个tab项。都是通过调用setTabSelection()方法来完成的,只是传入了不同的参数。

好了,这样我们就将全部的代码都编写完成了,下面就来运行一下吧。整个Tab的界面有点类似于QQ的感觉,并且可以通过点击不同的Tab来切换界面,如下图所示:

                                                   

另外,这个Tab界面即使在横屏的情况下也有不错的适用性哦,如下图所示:

                            

这样,我们就成功使用Fragment编写出了和TabHost一样的效果。每个界面的具体逻辑就可以写在相应的Fragment里,效果和之前写在Activity里是差不多的。如此一来,我们终于可以和那个被废弃的ActivityGroup说再见了!

 

Android实现下拉刷新、上拉加载功能

时间:2016-9-12   作者:   分类: Android   热度:89°  评论:0  
时间:2016-9-12   分类: Android    热度:89   评论:0

实现下拉刷新和上拉加载的功能,先看看实现后的效果图 


1.png2.png3.png4.png5.png

 源码地址:http://pan.baidu.com/s/1eR3xQD0

 

ListView的头布局和脚布局:

头布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:paddingBottom="15dp"
                android:paddingTop="10dp">
    <!--圆形进度条-->
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pull_to_refresh_progress"
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_centerVertical="true"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        android:indeterminate="false"
        android:visibility="gone"/>
    <!-- 箭头图标-->
    <ImageView
        android:id="@+id/pull_to_refresh_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="20dp"
        android:src="@drawable/ic_pulltorefresh_arrow"
        android:visibility="visible"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/pull_to_refresh_text"
        android:gravity="center"
        android:layout_gravity="center"
        android:paddingTop="5dp"
        android:text="下拉可刷新!"
        android:layout_marginTop="18dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textStyle="bold"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/pull_to_refresh_updated_at"
        android:layout_below="@id/pull_to_refresh_text"
        android:gravity="center"
        android:layout_gravity="center"
        android:paddingTop="5dp"
        android:textAppearance="?android:attr/textAppearanceSmall"
       android:visibility="gone"/>
</RelativeLayout>



<p style="text-indent:2em;">
 <br />
<p>
 &nbsp;
</p>
</p>
<p style="text-indent:2em;">
 <strong><span style="font-size:14px;">脚布局:</span></strong> 
</p>
<p style="text-indent:2em;">
 <strong></strong>&nbsp;
</p>
<p style="text-indent:2em;">
 <strong></strong>&nbsp;
</p>
<p>
 <strong>
</p>
<p style="text-indent:2em;">
 <p style="text-indent:2em;">
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:paddingBottom="15dp"
                android:paddingTop="10dp">
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/loadmode_progress"
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_centerVertical="true"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        android:indeterminate="true"
        android:visibility="visible"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/loadmode_text"
        android:gravity="center"
        android:layout_gravity="center"
        android:paddingTop="5dp"
        android:text="@string/loadmore_label"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textStyle="bold"/>
</RelativeLayout>
自定义Item视图:
 
<p>
 <span style="font-size:14px;"></span>
</p>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal"
        android:text="我是List"
        android:id="@+id/name"
        android:textSize="20dp"/>
</LinearLayout>
主视图:
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.learn.listviewrefresh.MainActivity">
    <com.learn.listviewrefresh.PullToRefreshListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/wibolist"
        android:fastScrollEnabled="true"
        android:cacheColorHint="#000000"/>
</LinearLayout>
    

 

自定义ListView:

 

/**
 * 自定义ListView
 */
public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener {
    /**
     * 当前的操作状态为——正常状态
     */
    private static final int NORMAL = 0;
    /**
     * 当前的操作状态为——提示下拉可以刷新的状态
     */
    private static final int PULL = 1;
    /**
     * 当前的操作状态为——松开可以刷新的状态
     */
    private static final int RELEASE = 2;
    /**
     * 当前的操作状态为——正在刷新状态
     */
    private static final int REFRESHING = 3;
    private OnScrollListener mOnScrollListener;         //列表滚动监听器
    private LayoutInflater mLayoutInflater;                 //用于加载布局文件
    private RelativeLayout mRefreshHeaderView; //刷新视图(顶部刷新动画)
    private TextView mRefreshHeaderText; //刷新顶部文字
    private ImageView mRefreshHeaderImage; //刷新顶部箭头
    private ProgressBar mRefreshHeaderProgerss;//刷新顶部进度条
    private RelativeLayout mLoadMoreFooterView; //加载更多
    private TextView mTextLoadMore;//提示文本
    private ProgressBar mLoadMoreProgress;//加载更多进度条
    private int mRefreshViewHeight;                            // 刷新视图高度
    int totalItemCount;// 总数量;
    int lastVisibleItem;// 最后一个可见的item;
    boolean isLoading;// 正在加载;
    /**
     * ListView当前滚动状态
     */
    private int scrollState = 0;
    /**
     * ListView当前屏幕可见的第一个item的位置
     */
    private int firstVisibleItem = 0;
    /**
     * 标识是否是在ListView的首个item出现在屏幕最顶端时手指按下
     */
    private boolean isRemark = false;
    /**
     * 当前屏幕中,ListViwe显示的第一个item是首个item时,手指按下时的Y轴坐标
     */
    private int startY = 0;
    /**
     * 当前的操作状态
     */
    private int currentState = 0;
    /**
     * 数据刷新接口
     */
    IReflashListener iReflashListener;//刷新数据的接口
    public PullToRefreshListView(Context context) {
        super(context);
        init(context);
    }
    public PullToRefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    public PullToRefreshListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }
    //初始化布局
    private void init(Context context) {
        // 获取LayoutInflater实例对象
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mRefreshHeaderView = (RelativeLayout) mLayoutInflater.inflate(R.layout.pull_to_refresh_header, this, false);
        //绑定控件
        mLoadMoreFooterView = (RelativeLayout) mLayoutInflater.inflate(R.layout.loadmore_footer, this, false);
        mTextLoadMore = (TextView) mLoadMoreFooterView.findViewById(R.id.loadmode_text);
        mLoadMoreProgress = (ProgressBar) mLoadMoreFooterView.findViewById(R.id.loadmode_progress);
            //设置底部视图不可见
        mLoadMoreFooterView.setVisibility(GONE);
        measureView(mRefreshHeaderView);
        mRefreshViewHeight = mRefreshHeaderView.getMeasuredHeight(); //得到视图的高度
        paddingTop(-mRefreshViewHeight);
        addHeaderView(mRefreshHeaderView);  //增加头部视图
        addFooterView(mLoadMoreFooterView); //增加顶部视图
        super.setOnScrollListener(this); //滑屏分页显示数据
    }
    public void setOnScrollListener(AbsListView.OnScrollListener l) {
        mOnScrollListener = l;
    }
    //触摸事件
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:  //手指按下
                if (0 == firstVisibleItem) {
                    isRemark = true;
                    startY = (int) event.getY();
                    Log.v("手指按下", "手指按下" + startY);
                }
                break;
            case MotionEvent.ACTION_MOVE:  ////手指移动
                onMove(event);
                break;
            case MotionEvent.ACTION_UP:   //手指抬起
                if (currentState == RELEASE) { // 提示“松开可以刷新”,那么就刷新数据
                    currentState = REFRESHING;
                    refreshListViewByCurrentState();
                    if (iReflashListener != null) {
                        iReflashListener.onRefresh();
                    }
                } else if (currentState == PULL) { // 提示“下拉可以刷新”,那么就复位
                    currentState = NORMAL;
                    isRemark = false;
                    refreshListViewByCurrentState();
                }
                break;
        }
        return super.onTouchEvent(event);
    }
    /**
     * 根据当前状态,来改变界面显示
     */
    private void refreshListViewByCurrentState() {
        // 加载下拉刷新的头部视图  绑定控件
        mRefreshHeaderImage = (ImageView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_image);
        mRefreshHeaderProgerss = (ProgressBar) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_progress);
        mRefreshHeaderText = (TextView) mRefreshHeaderView.findViewById(R.id.pull_to_refresh_text);
        // 箭头从上到下旋转180度的动画
        RotateAnimation upTodown = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        upTodown.setDuration(500);
        upTodown.setFillAfter(true);
        // 箭头从下到上旋转180度的动画
        RotateAnimation downToup = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        downToup.setDuration(500);
        downToup.setFillAfter(true);
        switch (currentState) {
            case NORMAL:
                mRefreshHeaderImage.clearAnimation();
                paddingTop(-mRefreshViewHeight);
                break;
            case PULL:
                mRefreshHeaderImage.setVisibility(View.VISIBLE);
                mRefreshHeaderText.setText("下拉可以刷新");
                mRefreshHeaderImage.clearAnimation();
                mRefreshHeaderImage.startAnimation(downToup);
                break;
            case RELEASE:
                mRefreshHeaderImage.setVisibility(View.VISIBLE);
                mRefreshHeaderProgerss.setVisibility(View.GONE);
                mRefreshHeaderText.setText("松开可以刷新");
                mRefreshHeaderImage.clearAnimation();
                mRefreshHeaderImage.startAnimation(upTodown);
                break;
            case REFRESHING:
                paddingTop(50);
                mRefreshHeaderImage.setVisibility(View.GONE);
                mRefreshHeaderProgerss.setVisibility(View.VISIBLE);
                mRefreshHeaderText.setText("刷新中...");
                mRefreshHeaderImage.clearAnimation();
                break;
        }
    }
    //判断移动过程
    private void onMove(MotionEvent event) {
        if (!isRemark) {
            return;
             /*
             * 如果不是手指在ListView的首个item出现在顶部时按下,并滑动的操作,
             * 说明用户不是在做下拉刷新的操作,那么就不需要做任何操作,方法直接放回
             */
        }
        int currentY = (int) event.getY(); // 当前手指移动到哪个位置
        int space = currentY - startY;    // 移动的距离是多少
        int paddingTop = space - mRefreshViewHeight;
        switch (currentState) {
            case NORMAL:
                if (space > 0) {
                    currentState = PULL;
                    refreshListViewByCurrentState();
                }
                break;
            case PULL:
                paddingTop(paddingTop);
                if (space - mRefreshViewHeight > 30
                        && scrollState == SCROLL_STATE_TOUCH_SCROLL) { // 移动距离大于一定高度,并且正在滚动
                    currentState = RELEASE;
                    refreshListViewByCurrentState();
                }
                break;
            case RELEASE:
                paddingTop(paddingTop);
                if (space - mRefreshViewHeight < 30) { // 如果小于一定的高度
                    currentState = PULL;
                    refreshListViewByCurrentState();
                }
                break;
        }
    }
    //获取视图大小
    private void measureView(View child) {
        ViewGroup.LayoutParams params = child.getLayoutParams();
        if (params == null) {
            params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        }
        int width = ViewGroup.getChildMeasureSpec(0, 0, params.width);
        int hight = 0;
        int tempHight = params.height;
        if (tempHight > 0) {
            hight = MeasureSpec.makeMeasureSpec(tempHight, MeasureSpec.EXACTLY);
        } else {
            hight = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        }
        child.measure(width, hight);
    }
    /**
     * 设置顶部布局的上内边距
     */
    private void paddingTop(int paddingTop) {
        mRefreshHeaderView.setPadding(mRefreshHeaderView.getPaddingLeft(), paddingTop, getListPaddingRight(), getListPaddingBottom());
        mRefreshHeaderView.invalidate();
    }
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        this.scrollState = scrollState;
        if (totalItemCount == lastVisibleItem && scrollState == SCROLL_STATE_IDLE && currentState == NORMAL) {
            if (!isLoading) {
                isLoading = true;
                mLoadMoreFooterView.setVisibility(VISIBLE);
                //加载更多
                iReflashListener.onRefresh2();
            }
        }
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.firstVisibleItem = firstVisibleItem; //第一个item
        this.lastVisibleItem = firstVisibleItem + visibleItemCount; //最后一个item = 第一个item + 可见的item
        this.totalItemCount = totalItemCount;
    }
    //加载完成
    public void reflashComplete() {
        currentState = NORMAL;
        isRemark = false;
        refreshListViewByCurrentState();
        isLoading = false;
        mLoadMoreFooterView.setVisibility(GONE);
    }
    public void setInterface(IReflashListener iReflashListener) {
        this.iReflashListener = iReflashListener;
    }
    /**
     * 数据刷新接口
     */
    public interface IReflashListener {
        public void onRefresh();
        public void onRefresh2();
    }
}
 <p>
   &nbsp;
  </p>
  <p>
   自定义Adapt:
  </p>
public class MyAdapter extends BaseAdapter {
    ArrayList<MyEntity> arrayList;
    LayoutInflater inflater;
    public MyAdapter(Context context,ArrayList<MyEntity> arrayList){
        this.arrayList = arrayList;
        this.inflater = LayoutInflater.from(context);
    }
    public void onDataChange(ArrayList<MyEntity> arrayList){
        this.arrayList = arrayList;
        this.notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return arrayList.size();
    }
    @Override
    public Object getItem(int position) {
        return arrayList.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyEntity entity = arrayList.get(position);
        ViewHolder holder;
        if (convertView==null){
            holder=new ViewHolder();
            convertView = inflater.inflate(R.layout.item_layout,null);
            holder.name = (TextView) convertView.findViewById(R.id.name);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.name.setText(entity.getName());
        return convertView;
    }
    class ViewHolder{
        TextView name;
    }
}
 <p>
   &nbsp;
  </p>
  <p>
   &nbsp;
  </p>
MyEntity.java
public class MyEntity {
    private String name;
    private String des;
    private String info;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
}
 
 MainActivity.java
public class MainActivity extends Activity implements PullToRefreshListView.IReflashListener {
    ArrayList<MyEntity> arrayList = new ArrayList<MyEntity>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getData();
        showList(arrayList);
    }
    MyAdapter adapter;
    PullToRefreshListView listView;
    private void showList(ArrayList<MyEntity> arrayList) {
        if (adapter == null) {
            listView = (PullToRefreshListView) findViewById(R.id.wibolist);
            listView.setInterface(this);
            adapter = new MyAdapter(this, arrayList);
            listView.setAdapter(adapter);
        } else {
            adapter.onDataChange(arrayList);
        }
    }
    private void getData() {
        for (int i = 0; i < 10; i++) {
            MyEntity entity = new MyEntity();
            entity.setName("数据");
            arrayList.add(entity);
        }
    }
    private void RefreshMoreData() {
        for (int i = 0; i < 2; i++) {
            MyEntity entity = new MyEntity();
            entity.setName("刷新的数据");
            arrayList.add(0,entity);
        }
    }
    private void LoadMoreData() {
        for (int i = 0; i < 2; i++) {
            MyEntity entity = new MyEntity();
            entity.setName("加载更多的数据");
            arrayList.add(entity);
        }
    }
    public void onLoad() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载更多数据
                RefreshMoreData();
                //更新ListView
                showList(arrayList);
                //通知ListView加载完成
                listView.reflashComplete();
            }
        }, 2000);
    }
    public void onLoadNext() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载更多数据
                LoadMoreData();
                //更新ListView
                showList(arrayList);
                //通知ListView加载完成
                listView.reflashComplete();
            }
        }, 2000);
    }
    @Override
    public void onRefresh() {
        onLoad();
        showList(arrayList);
    }
    @Override
    public void onRefresh2() {
        onLoadNext();
        showList(arrayList);
    }
}
 
 
<p>
 <br />
</p>

<p>
 <br />
</p>
 
 <p>
   <br />
  </p>
  <p style="text-indent:2em;">
   <br />
  </p>
  <p style="text-indent:2em;">
   </strong>
  </p>
  <p>
   </strong>
  </p>
  <p style="text-indent:2em;">
   <br />
<p>
 &nbsp;
</p>
 </p>

Android EditText 属性汇总

时间:2016-9-6   作者:   分类: Android   热度:196°  评论:0  
时间:2016-9-6   分类: Android    热度:196   评论:0

标签:
1.EditText输入限制规则
在xml:EditText 设置属性
android:digits="ABCDE123&*"
ABCDE123&*是你的限制规则
例如:android:digits="0123456789abc"
规则是只能输入英文字母(小写)abc和数字
2.EditTex输入的文字为密码形式
(1)在xml中设置
android:password="true" //以"."形式显示文本
(2)在代码里设置
通过设置EditTex的setTransformationMethod()方法来实现隐藏密码和显示密码
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
//设置密码不可见
3.EditTex输入的文字为电话号码
android:phoneNumber="true"//输入电话号码
4.EditTex字数限制
(1)在xml中设置
android:maxLength="50"
(2)在代码中设置
editText.setFilters(new InputFilter[]{newInputFilter.LengthFilter(100)});
5.EditTex是否可编辑
android:editable="true"//可编辑,false不可编辑
6.在EditText中软键盘的调起、关闭
(1)EditTex有焦点(focusable为true)阻止输入法弹出
editText.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View view,MotionEvent event){
editText.setInputType(Input.TYPE_NULL);//关闭软键盘
return false;
}});
(2)EditText无焦点(focusable=false)时阻挡输入法弹出
InputMethodManager imm=(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(),0);
(3)调用数字键盘并设置输入类型和键盘为英文
editText.setInputType(InputType.TYPE_CLASS_NUMBER);//调用数字键盘
editText.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);//英文
(4)键盘永远不会弹出
android:focusable="false"// 键盘永不弹出
7.软键盘的调起导致原来的界面被挤上去,或者导致界面下面的tab导航被挤上去,解决方法如下
使用Mainfest中的Activity的android:windowSfotInputMdoe的“adjustPan"属性
另外注意:有关软键盘的问题可参考android:windowSoftInputMode中的属性
8.光标详解
editText.requestFocusFromTouch();//让光标放入到点击位置
editText.requestFocus();//默认方式获得焦点
editText editor=(EditText)getCurrentView();//光标插入
int cursor=editor.getSelectionStart();//光标插入
editor.getText().inset(cursor,delta);
 
Android EditText 属性汇总
android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint="请输入数字!"
设置显示在空间上的提示信息 android:numeric="integer" 设置只能输入整数,如果是小数则是:
decimal android:singleLine="true" 设置单行输入,一旦设置为true,则文字不会自动换行。
android:password="true" 设置只能输入密码
android:textColor = "#ff8c00" 字体颜色
android:textStyle="bold" 字体,bold, italic, bolditalic android:textSize="20dip" 大小
android:capitalize = "characters" 以大写字母写
android:textAlign="center" EditText没有这个属性,但TextView有 android:textColorHighlight="#cccccc" 被选中文字的底色,默认为蓝色
android:textColorHint="#ffff00" 设置提示信息文字的颜色,默认为灰色 android:textScaleX="1.5" 控制字与字之间的间距
android:typeface="monospace" 字型,normal, sans, serif, monospace android:background="@null" 空间背景,这里没有,指透明
android:layout_weight="1" 权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse" 文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对? 通过EditText的layout xml文件中的相关属性来实现:
1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。
2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入
3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证 下面是一些扩展的风格属性
android:editable="false" 设置EditText不可编辑
android:singleLine="true" 强制输入的内容在单行
android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

Android键盘显示与隐藏

时间:2016-9-6   作者:   分类: Android   热度:115°  评论:0  
时间:2016-9-6   分类: Android    热度:115   评论:0
activity 按钮隐藏输入法键盘
InputMethodManager inputMethodManager = 
(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(numberPicker.getWindowToken(), 0);
在Fragment中,隐藏或关闭软键盘(虚拟键盘)的方法
/隐藏虚拟键盘
      public static void HideKeyboard(View v)
      {
          InputMethodManager imm = ( InputMethodManager ) v.getContext( ).getSystemService( Context.INPUT_METHOD_SERVICE );     
        if ( imm.isActive( ) ) {     
            imm.hideSoftInputFromWindow( v.getApplicationWindowToken( ) , 0 );   
            
        }    
      }

部分Android手机拍照后照片被旋转的解决方案

时间:2016-8-9   作者:   分类: Android   热度:82°  评论:0  
时间:2016-8-9   分类: Android    热度:82   评论:0

在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,可以在onActivityResult方法中,获取到照片数据后,读取它的旋转信息,如果不是0,说明这个照片已经被旋转过了,那么再使用android.graphics.Matrix将照片旋转回去即可。

1、读取图片的旋转属性

/**
 * 读取图片的旋转的角度
 *
 * @param path
 *            图片绝对路径
 * @return 图片的旋转角度
 */
private int getBitmapDegree(String path) {
    int degree = 0;
    try {
        // 从指定路径下读取图片,并获取其EXIF信息
        ExifInterface exifInterface = new ExifInterface(path);
        // 获取图片的旋转信息
        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            degree = 90;
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            degree = 180;
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            degree = 270;
            break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return degree;
}
2、将图片按照某个角度进行旋转

/**
 * 将图片按照某个角度进行旋转
 *
 * @param bm
 *            需要旋转的图片
 * @param degree
 *            旋转角度
 * @return 旋转后的图片
 */
public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
    Bitmap returnBm = null;
  
    // 根据旋转角度,生成旋转矩阵
    Matrix matrix = new Matrix();
    matrix.postRotate(degree);
    try {
        // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
        returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
    } catch (OutOfMemoryError e) {
    }
    if (returnBm == null) {
        returnBm = bm;
    }
    if (bm != returnBm) {
        bm.recycle();
    }
    return returnBm;
}

Android Bitmap详细介绍

时间:2016-8-9   作者:   分类: Android   热度:89°  评论:0  
时间:2016-8-9   分类: Android    热度:89   评论:0


package com.testbitmapscale; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Iterator; 
import com.testbitmapscale.R.drawable; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.media.ThumbnailUtils; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.widget.ImageView; 
//方法: 
//1 生成圆角Bitmap图片 
//2 生成Bitmap缩量图 
//3 压缩图片场长宽以及kB 
//注意: 
//以上代码,测试其中一个方法时最好注释掉其余的代码 
public class MainActivity extends Activity { 
private ImageView imageView; 
private Bitmap copyRawBitmap1; 
private Bitmap copyRawBitmap2; 
private Bitmap copyRawBitmap3; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
imageView = (ImageView) findViewById(R.id.imageView); 
//第一种方式:从资源文件中得到图片 
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha); 
copyRawBitmap1=rawBitmap; 
copyRawBitmap2=rawBitmap; 
copyRawBitmap3=rawBitmap; 
//第二种方式:从SD卡中得到图片(方法1) 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+"/"+"haha.jpg"; 
Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); 
//第二种方式:从SD卡中得到图片(方法2) 
InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); 
Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream); 

//————>以下为将设置图片的圆角 
Bitmap roundCornerBitmap=this.toRoundCorner(rawBitmap, 40); 
imageView.setImageBitmap(roundCornerBitmap); 
//————>以上为将设置图片的圆角 

//————>以下为将图片高宽和的大小kB压缩 
// 得到图片原始的高宽 
int rawHeight = rawBitmap.getHeight(); 
int rawWidth = rawBitmap.getWidth(); 
// 设定图片新的高宽 
int newHeight = 500; 
int newWidth = 500; 
// 计算缩放因子 
float heightScale = ((float) newHeight) / rawHeight; 
float widthScale = ((float) newWidth) / rawWidth; 
// 新建立矩阵 
Matrix matrix = new Matrix(); 
matrix.postScale(heightScale, widthScale); 
// 设置图片的旋转角度 
//matrix.postRotate(-30); 
// 设置图片的倾斜 
//matrix.postSkew(0.1f, 0.1f); 
//将图片大小压缩 
//压缩后图片的宽和高以及kB大小均会变化 
Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,rawWidth, matrix, true); 
// 将Bitmap转换为Drawable 
Drawable newBitmapDrawable = new BitmapDrawable(newBitmap); 
imageView.setImageDrawable(newBitmapDrawable); 
//然后将Bitmap保存到SDCard中,方便于原图片的比较 
this.compressAndSaveBitmapToSDCard(newBitmap, "xx100.jpg", 80); 
//问题: 
//原图大小为625x690 90.2kB 
//如果设置图片500x500 压缩后大小为171kB.即压缩后kB反而变大了. 
//原因是将:compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
//第二个参数quality设置得有些大了(比如100). 
//常用的是80,刚设100太大了造成的. 
//————>以上为将图片高宽和的大小kB压缩 


//————>以下为将图片的kB压缩,宽高不变 
this.compressAndSaveBitmapToSDCard(copyRawBitmap1,"0011fa.jpg",80); 
//————>以上为将图片的kB压缩,宽高不变 

//————>以下为获取SD卡图片的缩略图方法1 
String SDCarePath1=Environment.getExternalStorageDirectory().toString(); 
String filePath1=SDCarePath1+"/"+"haha.jpg"; 
Bitmap bitmapThumbnail1=this.getBitmapThumbnail(filePath1); 
imageView.setImageBitmap(bitmapThumbnail1); 
//————>以上为获取SD卡图片的缩略图方法1 

//————>以下为获取SD卡图片的缩略图方法2 
String SDCarePath2=Environment.getExternalStorageDirectory().toString(); 
String filePath2=SDCarePath2+"/"+"haha.jpg"; 
Bitmap tempBitmap=BitmapFactory.decodeFile(filePath2); 
Bitmap bitmapThumbnail2=ThumbnailUtils.extractThumbnail(tempBitmap, 100, 100); 
imageView.setImageBitmap(bitmapThumbnail2); 
//————>以上为获取SD卡图片的缩略图方法2 


//读取SD卡下的图片 
private InputStream getBitmapInputStreamFromSDCard(String fileName){ 
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+File.separator+fileName; 
File file=new File(filePath); 
try { 
FileInputStream fileInputStream=new FileInputStream(file); 
return fileInputStream; 
} catch (Exception e) { 
e.printStackTrace(); 



return null; 



//获取SDCard的目录路径功能 
private String getSDCardPath() { 
String SDCardPath = null; 
// 判断SDCard是否存在 
boolean IsSDcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
if (IsSDcardExist) { 
SDCardPath = Environment.getExternalStorageDirectory().toString(); 

return SDCardPath; 

//压缩且保存图片到SDCard 
private void compressAndSaveBitmapToSDCard(Bitmap rawBitmap,String fileName,int quality){ 
String saveFilePaht=this.getSDCardPath()+File.separator+fileName; 
File saveFile=new File(saveFilePaht); 
if (!saveFile.exists()) { 
try { 
saveFile.createNewFile(); 
FileOutputStream fileOutputStream=new FileOutputStream(saveFile); 
if (fileOutputStream!=null) { 
//imageBitmap.compress(format, quality, stream); 
//把位图的压缩信息写入到一个指定的输出流中 
//第一个参数format为压缩的格式 
//第二个参数quality为图像压缩比的值,0-100.0 意味着小尺寸压缩,100意味着高质量压缩 
//第三个参数stream为输出流 
rawBitmap.compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 

fileOutputStream.flush(); 
fileOutputStream.close(); 
} catch (IOException e) { 
e.printStackTrace(); 





//获取图片的缩略图 
private Bitmap getBitmapThumbnail(String filePath){ 
BitmapFactory.Options options=new BitmapFactory.Options(); 
//true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息 
options.inJustDecodeBounds=true; 
//此时rawBitmap为null 
Bitmap rawBitmap = BitmapFactory.decodeFile(filePath, options); 
if (rawBitmap==null) { 
System.out.println("此时rawBitmap为null"); 

//inSampleSize表示缩略图大小为原始图片大小的几分之一,若该值为3 
//则取出的缩略图的宽和高都是原始图片的1/3,图片大小就为原始大小的1/9 
//计算sampleSize 
int sampleSize=computeSampleSize(options, 150, 200200); 
//为了读到图片,必须把options.inJustDecodeBounds设回false 
options.inJustDecodeBounds = false; 
options.inSampleSize = sampleSize; 
//原图大小为625x690 90.2kB 
//测试调用computeSampleSize(options, 100, 200
100); 
//得到sampleSize=8 
//得到宽和高位79和87 
//798=632 878=696 
Bitmap thumbnailBitmap=BitmapFactory.decodeFile(filePath, options); 
//保存到SD卡方便比较 
this.compressAndSaveBitmapToSDCard(thumbnailBitmap, "15.jpg", 80); 
return thumbnailBitmap; 


//参考资料: 
//http://my.csdn.net/zljk000/code/detail/18212&nbsp;<br /> //第一个参数:原本Bitmap的options 
//第二个参数:希望生成的缩略图的宽高中的较小的值 
//第三个参数:希望生成的缩量图的总像素 
public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels); 
int roundedSize; 
if (initialSize <= 8) { 
roundedSize = 1; 
while (roundedSize < initialSize) { 
roundedSize <<= 1; 

} else { 
roundedSize = (initialSize + 7) / 8 8; 

return roundedSize; 


private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
//原始图片的宽 
double w = options.outWidth; 
//原始图片的高 
double h = options.outHeight; 
System.out.println("========== w="+w+",h="+h); 
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math 
.sqrt(w
h / maxNumOfPixels)); 
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( 
Math.floor(w / minSideLength), Math.floor(h / minSideLength)); 
if (upperBound < lowerBound) { 
// return the larger one when there is no overlapping zone. 
return lowerBound; 

if ((maxNumOfPixels == -1) && (minSideLength == -1)) { 
return 1; 
} else if (minSideLength == -1) { 
return lowerBound; 
} else { 
return upperBound; 



/** 

  • @param bitmap 需要修改的图片 
  • @param pixels 圆角的弧度 
  • @return 圆角图片 
    */ 
    //参考资料: 
    //http://blog.csdn.net/c8822882/article/details/6906768&nbsp;<br /> public Bitmap toRoundCorner(Bitmap bitmap, int pixels) { 
    Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(roundCornerBitmap); 
    int color = 0xff424242;//int color = 0xff424242; 
    Paint paint = new Paint(); 
    paint.setColor(color); 
    //防止锯齿 
    paint.setAntiAlias(true); 
    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    RectF rectF = new RectF(rect); 
    float roundPx = pixels; 
    //相当于清屏 
    canvas.drawARGB(0, 0, 0, 0); 
    //先画了一个带圆角的矩形 
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    //再把原来的bitmap画到现在的bitmap!!!注意这个理解 
    canvas.drawBitmap(bitmap, rect, rect, paint); 
    return roundCornerBitmap; 



Android控件属性大全

时间:2016-8-8   作者:   分类: Android   热度:59°  评论:0  
时间:2016-8-8   分类: Android    热度:59   评论:0

第一类:属性值为true或false
android:layout_centerHrizontal 水平居中 (Hrizontal表示水平)
android:layout_centerVertical 垂直居中 (Vertiacl表示垂直)
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘 (align 表示使什么成为一行)
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
第二类:属性值必须为id的引用名"@id/id-name"
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 离某元素底边缘的距离 margin英文是边缘的意思
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离

EditText的属性

android:hint 设置EditText为空时输入框内的提示信息。
android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
android:layout_gravity
android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
android:scaleType:
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。

ImageView.ScaleType / android:scaleType值的意义区别:
CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
* 要注意一点,Drawable文件夹里面的图片命名是不能大写的。

android:id
为控件指定相应的ID
android:text
指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:gravity
指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身
android:layout_gravity
指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity="right"则button靠右
android:textSize
指定控件当中字体的大小
android:background
指定该控件所使用的背景色,RGB命名法
android:width
指定控件的宽度 控件与组件
android:height
指定控件的高度
android:layout_width
指定Container组件的宽度
android:layout_height
指定Container组件的高度


android:layout_weight
View中很重要的属性,按比例划分空间


android:padding

指定控件的内边距,也就是说控件当中的内容


android:sigleLine
如果设置为真的话,则控件的内容在同一行中进行显示
android:scaleType
是控制图片如何resized/moved来匹对ImageView的siz
android:layout_centerHrizontal
水平居中
android:layout_centerVertical
垂直居中
android:layout_centerInparent
相对于父元素完全居中
android:layout_alignParentBottom
贴紧父元素的下边缘
android:layout_alignParentLeft
贴紧父元素的左边缘
android:layout_alignParentRight
贴紧父元素的右边缘
android:layout_alignParentTop
贴紧父元素的上边缘
android:layout_alignWithParentIfMissing
如果对应的兄弟元素找不到的话就以父元素做参照物
android:layout_below
在某元素的下方
android:layout_above
在某元素的的上方
android:layout_toLeftOf
在某元素的左边
android:layout_toRightOf
在某元素的右边
android:layout_alignTop
本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft
本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom
本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight
本元素的右边缘和某元素的的右边缘对齐
android:layout_marginBottom
离某元素底边缘的距离
android:layout_marginLeft
离某元素左边缘的距离
android:layout_marginRight
离某元素右边缘的距离
android:layout_marginTop
离某元素上边缘的距离
android:paddingLeft
本元素内容离本元素右边缘的距离
android:paddingRight
本元素内容离本元素上边缘的距离
android:hint
设置EditText为空时输入框内的提示信息
android:LinearLayout
它确定了LinearLayout的方向,其值可以为vertical, 表示垂直布局horizontal, 表示水平布局


android:interpolator
可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator 在动画的以均匀的速率改变
对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。

TextView属性汇总

android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)

android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。

android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。

android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。

android:cursorVisible设定光标为显示/隐藏,默认显示。

android:digits设置允许输入哪些字符。如"1234567890.+-*/% ()"

android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。

android:drawableLeft在text的左边输出一个drawable,如图片。

android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。

android:drawableRight在text的右边输出一个drawable。

android:drawableTop在text的正上方输出一个drawable。

android:editable设置是否可编辑。

android:editorExtras设置文本的额外的输入数据。

android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:"start"—-省略号显示在开头;"end" ——省略号显示在结尾;"middle"—-省略号显示在中间;"marquee" ——以跑马灯的方式显示(动画横向移动)

android:freezesText设置保存文本的内容以及光标的位置。

android:gravity设置文本位置,如设置成"center",文本将居中显示。

android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在 EditView中使用,但是这里也可以用。

android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个"完成",而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。

android:imeActionId设置IME动作ID。

android:imeActionLabel设置IME动作标签。

android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。

android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。

android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。

android:linksClickable设置链接是否点击连接,即使设置了autoLink。

android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。

android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度

android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:maxLength限制显示的文本长度,超出部分不显示。

android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。

android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。

android:minLines设置文本的最小行数,与lines类似。

android:lineSpacingExtra设置行间距。

android:lineSpacingMultiplier设置行间距的倍数。如"1.2"

android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。

android:password以小点"."显示文本

android:phoneNumber设置为电话号码的输入方式。

android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。

android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。

android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果。

android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。

android:shadowDx设置阴影横向坐标开始位置。

android:shadowDy设置阴影纵向坐标开始位置。

android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。

android:singleLine设置单行显示。如果和layoutwidth一起使用,当文本不能全部显示时,后面用"…"来表示。如android:text="test singleLine "

android:singleLine="true" android:layout_width="20dp"将只显示"t…"。如果不设置singleLine或者设置为false,文本将自动换行

android:text设置显示文本.

android:textAppearance设置文字外观。如 "?android:attr/textAppearanceLargeInverse"这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor设置文本颜色

android:textColorHighlight被选中文字的底色,默认为蓝色

android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。

android:textColorLink文字链接的颜色.

android:textScaleX设置文字之间间隔,默认为1.0f。

android:textSize设置文字大小,推荐度量单位"sp",如"15sp"

android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用"|"隔开

android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]

android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)

android:maxHeight设置文本区域的最大高度

android:minHeight设置文本区域的最小高度

android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width 的区别看这里。

android:maxWidth设置文本区域的最大宽度

android:minWidth设置文本区域的最小宽度

Android activity属性汇总

android:allowTaskReparenting

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。

android:alwaysRetainTaskState

是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态

android:clearTaskOnLanunch

比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P,是否显示 Q

android:configChanges

当配置list发生修改时,是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".

android:enabled

activity 是否可以被实例化,

android:excludeFromRecents

是否可被显示在最近打开的activity列表里

android:exported

是否允许activity被其它程序调用

android:finishOnTaskLaunch

是否关闭已打开的activity当用户重新启动这个任务的时候

android.icon

android:label

android:launchMode

activity启动方式, "standard" "singleTop" "singleTask" "singleInstance"

其中前两个为一组, 后两个为一组

android:multiprocess

允许多进程

android:name

activity的类名, 必须指定

androidnHistory

是否需要移除这个activity当用户切换到其他屏幕时。这个属性是 API level 3 中引入的

android:permission

android:process

一 个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。

android:screenOrientation

activity显示的模式, "unspecified" 默认值 "landscape" 风景画模式,宽度比高度大一些 "portrait" 肖像模式, 高度比宽度大。 "user" 用户的设置 "behind" "sensor" "nosensor"

android:stateNotNeeded

是否 activity被销毁和成功重启并不保存状态

android:taskAffinity

activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系

android:theme

activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序,参见元素的theme属性

android:windowSoftInputMode

activity主窗口与软键盘的交互模式, 自从API level 3 被引入

活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情:

1> 软键盘的状态——是否它是隐藏或显示——当活动(Activity)成为用户关注的焦点。

2> 活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。

它的设置必须是下面列表中的一个值,或一个"state…"值加一个"adjust…"值的组合。在任一组设置多个值——多个"state…"values,例如&mdash有未定义的结果。各个值之间用|分开。例如: <activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >

在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值

值 描述

"stateUnspecified" 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。

"stateUnchanged" 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。

"stateHidden" 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

"stateAlwaysHidden" 软键盘总是被隐藏的,当该Activity主窗口获取焦点时。

"stateVisible" 软键盘是可见的,当那个是正常合适的时(当用户导航到Activity主窗口时)。

"stateAlwaysVisible" 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

"adjustUnspecified" 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。

"adjustResize" 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间。

"adjustPan" 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

Android EditText 属性汇总

android:layout_gravity="center_vertical"

设置控件显示的位置:默认top,这里居中显示,还有bottom

android:hint="请输入数字!"

设置显示在空间上的提示信息

android:numeric="integer"

设置只能输入整数,如果是小数则是:decimal

android:singleLine="true"

设置单行输入,一旦设置为true,则文字不会自动换行。

android:password="true"

设置只能输入密码

android:textColor = "#ff8c00"

字体颜色

android:textStyle="bold"

字体,bold, italic, bolditalic

android:textSize="20dip"

大小

android:capitalize = "characters"

以大写字母写

android:textAlign="center"

EditText没有这个属性,但TextView有

android:textColorHighlight="#cccccc"

被选中文字的底色,默认为蓝色

android:textColorHint="#ffff00"

设置提示信息文字的颜色,默认为灰色

android:textScaleX="1.5"

控制字与字之间的间距

android:typeface="monospace"

字型,normal, sans, serif, monospace

android:background="@null"

空间背景,这里没有,指透明

android:layout_weight="1"

权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。

android:textAppearance="?android:attr/textAppearanceLargeInverse"

文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对?

通过EditText的layout xml文件中的相关属性来实现:

  1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。

  2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

  3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证

    下面是一些扩展的风格属性

    android:editable="false" 设置EditText不可编辑

    android:singleLine="true" 强制输入的内容在单行

    android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

    RelativeLayout布局

    android:layout_marginTop="25dip" //顶部距离

    android:gravity="left" //空间布局位置

    android:layout_marginLeft="15dip //距离左边距

    // 相对于给定ID控件

    android:layout_above 将该控件的底部置于给定ID的控件之上;

    android:layout_below 将该控件的底部置于给定ID的控件之下;

    android:layout_toLeftOf 将该控件的右边缘与给定ID的控件左边缘对齐;

    android:layout_toRightOf 将该控件的左边缘与给定ID的控件右边缘对齐;

    android:layout_alignBaseline 将该控件的baseline与给定ID的baseline对齐;

    android:layout_alignTop 将该控件的顶部边缘与给定ID的顶部边缘对齐;

    android:layout_alignBottom 将该控件的底部边缘与给定ID的底部边缘对齐;

    android:layout_alignLeft 将该控件的左边缘与给定ID的左边缘对齐;

    android:layout_alignRight 将该控件的右边缘与给定ID的右边缘对齐;

    // 相对于父组件

    android:layout_alignParentTop 如果为true,将该控件的顶部与其父控件的顶部对齐;

    android:layout_alignParentBottom 如果为true,将该控件的底部与其父控件的底部对齐;

    android:layout_alignParentLeft 如果为true,将该控件的左部与其父控件的左部对齐;

    android:layout_alignParentRight 如果为true,将该控件的右部与其父控件的右部对齐;

    // 居中

    android:layout_centerHorizontal 如果为true,将该控件的置于水平居中;

    android:layout_centerVertical 如果为true,将该控件的置于垂直居中;

    android:layout_centerInParent 如果为true,将该控件的置于父控件的中央;

    // 指定移动像素

    android:layout_marginTop 上偏移的值;

    android:layout_marginBottom 下偏移的值;

    android:layout_marginLeft 左偏移的值;

    android:layout_marginRight   右偏移的值;

    android:id --- 为控件指定相应的ID

    android:text --- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串

    android:grivity --- 指定控件的基本位置,比如说居中,居右等位置这里指的是控件中的文本位置并不是控件本身。

    android:textSize --- 指定控件当中字体的大小

    android:background --- 指定该控件所使用的背景色,RGB命名法

    android:width --- 指定控件的宽度

    android:height --- 指定控件的高度

    android:padding* --- 指定控件的内边距,也就是说控件当中的内容

    android:sigleLine --- 如果设置为真的话,则控件的内容在同一行中进行显示

    下边是相对布局属性的说明:RelativeLayout

    android:layout_above 将该控件的底部至于给定ID控件之上

    android:layout_below 将该控件的顶部至于给定ID的控件之下

    android:layout_toLeftOf 将该控件的右边缘和给定ID的控件左边缘对齐

    android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐

    android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐

    android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘对齐

    android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐

    android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐

    android:layout_alignTop 将该控件的顶部边缘与给定ID控件的顶部对齐

    android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐

    android:layout_alignParentLeft 如果该值为true,则将该控件左边与父控件的左边对齐

    android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐

    android:layout_alignParentTop 如果该值为true,则将该控件的顶部与父控件的顶部对齐

    android:layout_centerHorizontal 如果为真,该控件将被至于水平方向的中央

    android:layout_centerInParent 如果为真,该控件将被至于父控件水平方向和垂直方向的中央

    android:layout_centerVertical 如果为真,该控件将被至于垂直方向的中央

    android:layout_marginLeft此属性用来设置控件之间的间隙(控件和控件之间和内边距不同)

    android:padding="3dip"说明了四边的内边距是3dip

    TableLayout

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />
    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:stretchColumns="0"

    ></TableLayout>

    android:stretchColumns="0"第一列作为拉伸列填满整行

    Java中修饰符总结:

    1、访问控制修饰符

    public的访问级别是最高的,其次是protected、默认和private

    成员变量和成员方法可以处于4个访问级别中的一个:公开、受保护、默认或私有

    顶层类可以处于公开或默认级别,顶层类不能被protected和private修饰

    局部变量不能被访问控制修饰符修饰

    2、abstract修饰符

    抽象类不能被实例化

    抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象方法

    如果子类没有实现父类中所有的抽象方法,子类也必须定义为抽象类

    抽象类不能被定义为private、final、和static类型

    没有抽象的构造方法

    抽象方法没有方法体

    3、final修饰符

    用final修饰的类不能被继承

    用final修饰的方法不能被子类的方法覆盖

    private类型的方法都默认为是final方法,因而不能被子类的方法覆盖

    final变量必须被显式初始化,并且只能被赋值一次值

    4、static修饰符

    静态变量在内存中只有一个拷贝,在类的所有实例中共享

    在静态方法中不能直接访问实例方法和实例变量

    在静态方法中不能使用this和super关键字

    静态方法不能被abstract修饰

    静态方法和静态变量都可以通过类名直接访问

    当类被加载时,静态代码块只能被执行一次。类中不同的静态方法代码块按他们在类中出现的顺序被依次执行

    当多个修饰符连用时,修饰符的顺序可以颠倒,不过作为普遍遵守的编程规范,通常把访问控制修饰符放在首位,其次是static或abstact修饰符,接着就是其他的修饰符

    5、以下修饰符连用是无意义的,会导致编译错误:

    abstract与private

    abstract与final

    abstract与static

Android 控件布局常用属性

时间:2016-8-8   作者:   分类: Android   热度:67°  评论:0  
时间:2016-8-8   分类: Android    热度:67   评论:0

<!--单个控件经常用到
android:id —— 为控件指定相应的ID
android:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:grivity —— 指定控件的基本位置,比如说居中,居右等位置
android:textSize —— 指定控件当中字体的大小
android:background —— 指定该控件所使用的背景色,RGB命名法 
android:width —— 指定控件的宽度
android:height —— 指定控件的高度
android:padding* —— 指定控件的内边距,也就是说控件当中的内容
android:sigleLine —— 如果设置为真的话,则将控件的内容在同一行当中进行显示
-->

 

<!--相对布局时经常用到
android:layout_above 将该控件的底部至于给定ID的控件之上
android:layout_below 将该控件的顶部至于给定ID的控件之下
android:layout_toLeftOf 将该控件的右边缘和给定ID的控件的左边缘对齐
android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐

android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘对齐
android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐
android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐
android:layout_alignTop 将给定控件的顶部边缘与给定ID控件的顶部对齐


android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 如果该值为true,则将空间的顶部与父控件的顶部对齐

android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
android:layout_centerInParent 如果值为真,该控件将被至于父控件水平方向和垂直方向的中央
android:layout_centerVertical 如果值为真,该控件将被至于垂直方向的中央
-->

 

扩展知识:

EditText的android:hint 

设置EditText为空时输入框内的提示信息。 

android:gravity  
android:gravity属性是对该view 内容的限定.比如一个button 上面的text.  你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右 

android:layout_gravity 
android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右 

android:layout_alignParentRight 
使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。 

android:scaleType: 
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别: 

CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 

CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) 

CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 

FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示 

FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 

FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 

FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示 

MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。 

要注意一点,Drawable文件夹里面的图片命名是不能大写的。

返回顶部    首页    手气不错    QQ邮箱:1085911874@qq.com后花园   
版权所有:Remember    站长:                 sitemap