系统Widget相关


组件-控件

一.组件属性

1.androidlayout_weight

表示该组件在layout中所占的比重即占布局(layout)的百分比,其值越大,比重越小

注意:{必须将控件的layout_width = fill_parent|match_parent,否则weight属性将不起作用。}

注:如果设为“fill_parent”则weight属性将是你的控件尽可能的大,最大为fill_parent

如果,设为wrap_contentweight属性将使你的控件尽可能小,最小为wrap_content

例如:

效果图

 

代码如下:

 

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" >

 

        <Button

            android:id="@+id/button2"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="1/4" />

 

        <Button

            android:id="@+id/button3"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="2/4" />

 

        <Button

            android:id="@+id/button1"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="1/4" />

 

    </LinearLayout>

 

 

二.View-------存储屏幕上特定的矩形区域和内容属性的数据结构

有关属性VISIBLE---显示-----0(xml)

INVISIBLE----不可见占空间4(xml),

 GONE-----不显示不占用空间8(xml)

setVisibility()套用

.事件处理及焦点切换

1.按键

1boolean onKeyDownint keyCode, KeyEvent event

注:如果在其中不做与按键有关的事则返回false,让按键事件继续传递,交给更上层处理。如果处理了按键事件则返回true告诉系统我处理了事件了,不会继续传递。

onKeyUp(int keyCode, KeyEvent event)

onTouchEvent(MontionEven

2.控件在一般情况下和在Adapter中的区别

一般情况下可以直接填加事件响应如,button.setOnClickListener(this);

如果在Adapter中则,必须要在Adapter中添加事件响应而不是在Activity中,否则得不到响应,可以这样理解,Adapter要的是View,那么我就把已经添加好了所有事件的view给你,在给你之前我早已封装完毕。如果返回的view添加了事件响应,则返回的view就具备响应事件的能力,如果没添加则不具备事件响应的能力。

2.列表--下拉列表

设置监听:setOnItemSelectedListener()------实现onItemSelected()-----列表选择

3.单项选择

onCheckedChange()----选择改变

4.多项选择

onClickListener()-----选择

代码

 

5.焦点相关

1)如何指定layout中控件的焦点顺序

继承自View类的控件都有android:focusableandroid:focusableInTouchMode属性,可以指定控件获取焦点。

其中android:nextFocusDown="@id/feed_back_city"

Android:nextFocusUp|Left|Right

指定了该焦点控件的下一个控件的焦点,上下左右分别代表距离该控件上下左右最近的控件。

三.常用控件

1.文本组件

---android.text.style中的各种Span类功能很强大,可以由XXXSpan类对文本实现,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得android中有个android.text包,这里提供了对文本的强大的处理功能。

 

 

1.1  TextView

1.1.1   TextView中显示HTML和图片 

A)使用<img>标签

TextView description=(TextView)findViewById(R.id.description);  

description.setText(Html.fromHtml(htmlStr));  

 

如果HTML中有图片的话,显示出来的图片会被一个小框取代,那么怎么样才能看到图片呢?查看了一下APIandroid.text.Html还还有另一个方法:Html.fromHtml(String source,ImageGetter imageGetter,TagHandler tagHandler),这个方法使用如下所示: 

Java代码  

//<img src='http://XXX.png' />的情况  

ImageGetter imgGetter = new Html.ImageGetter() {  

        public Drawable getDrawable(String source) {  

            Drawable drawable = null;  

            Log.d("Image Path", source);  

            URL url;  

            try {  

                url = new URL(source);  

                drawable = Drawable.createFromStream(url.openStream(), "");  

            } catch (Exception e) {  

                return null;  

            }  

            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  

            return drawable;  

        }  

    };  

.........  

TextView description=(TextView)findViewById(R.id.description);  

description.setText(Html.fromHtml(htmlStr,imgGetter,null));  

 

 

如果图片在该工程的res/drawable下,那么可以使用下面这种:

Java代码  

//<img src='" + R.drawable.icon + "' />的情况  

 ImageGetter imgGetter = new Html.ImageGetter() {  

   @Override  

   public Drawable getDrawable(String source) {  

    int id = Integer.parseInt(source);  

    Drawable drawable = getResources().getDrawable(id);  

    //int height = fontH;  

    //int width = (int) ((float) drawable.getIntrinsicWidth() / (float) drawable.getIntrinsicHeight()) * fontH;  

    //drawable.setBounds(0, 0, width, height);  

    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  

    return drawable;  

   }  

  };  

 

怎么样?很简单,第二个参数TagHandler是干什么的呢?从名称我们就知道是处理HTML中的标签的,比如说遇到某个标签就把它替换为….之类的操作都可以通过TagHandler来处理,呵呵,我可没试过哦,瞎猜的,程序员一定要发挥充分的想像力,自己去试一下吧! 

最后我要说的是,如果你的图片是从网络上获取的,那么你一定不要用这种方法显示一张图片,因为这是最垃圾的办法,你的程序会经常被卡死。 

那么有没有更好的方法呢?也许不是最好,但我建议您可以使用WebView来显示HTML内容。

注:通过将图片转化为CharSequence来实现,不过还要实现一个ImageGetter

B)使用ImagSpan

Bitmap bitmap = BitmapFactory.decodeResource(getResource(),R.drawable.XXX);

ImageSpan imagSpan = new ImagSpan(this,bitmap);

SpannableString sS= new SpannableString(“icon”);

sS.setSpan(imagSpan,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

textview.setText(sS);

注:两者之间的比较

A)方法是将<img>标签有Html.fromHtml(html,ImageGetter)来实现的,这个需要实现一个ImageGetter以返回一Drawable对象,比较麻烦

B)方法则是将图片资源替换SpannableString对象中的文字来实现的,方便,上面是将icon替换成了图片

 

1.1.2  URL连接

通过Span对象的使用来实现的,在android.text.style包中有许多的Span类可以改变或添加ViewStyle,其中URLSpan类可以实现

 

 

1.1.3  设置超链接

xml文本中设置autoLink属性

webSite = (TextView)findViewById(R.id.webSite);

Linkify.addLinks(webSite, Linkify.ALL);//设置超链接

有关属性是none web phone email all

1.1.4  文本高亮

需要的文字高亮显示: 

Java代码  

public void highlight(int start,int end){  

        SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());//用于可变字符串  

        ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);  

        spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        setText(spannable);  

    }  

另外有个问题:如何让一个TextView中的关键字高亮显示? 

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=57880&page=1&extra=#pid558440 

解决如下: 

Java代码  

/** 

     * 关键字高亮显示 

     * @param target 需要高亮的关键字 

     */  

    public void highlight(String target){  

        String temp=getText().toString();  

        SpannableStringBuilder spannable = new SpannableStringBuilder(temp);  

        CharacterStyle span=null;  

          

        Pattern p = Pattern.compile(target);  

        Matcher m = p.matcher(temp);  

        while (m.find()) {  

            span = new ForegroundColorSpan(Color.RED);//需要重复!  

            spannable.setSpan(span, m.start(), m.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        }  

        setText(spannable);  

    }  

 

 

1.1.5  加下划线:

 

Java代码  

public void underline(int start,int end){  

        TextView email = (TextView) this.findViewById(R.id.about_email);

String emailText = email.getText().toString();

SpannableStringBuilder spannable=new SpannableStringBuilder(emailText);  

        CharacterStyle span=new UnderlineSpan();  

        spannable.setSpan(span, 0, emailText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        email.setText(spannable);  

 

    }  

 

 

 

1.1.6  高级学习


A)实现省略号

androidellipsize----textView显示的内容太多时,我们可以用省略号来显示,使用androidellipsize属性可以设置

设置textView只显示单行 android:singleLine = true

实现单行内容超出添加省略号

android:ellipsize="end"

        android:singleLine="true"

 

B)代码实现超链接,改变字体样式,添加下划线等

SpannableString类:SpannableString sp = new SpannableString(“设置tv的属性”)

设置超链接

sp.setSpan(new URLSpan(“http://www.baidu.com”),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

设置高亮

sp.setSpan(new BacgroundColor(Color.white),20,24,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)

 组合运用:斜体等 

Java代码  

SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  

        CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC);  

        CharacterStyle span_2=new ForegroundColorSpan(Color.RED);  

        spannable.setSpan(span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        setText(spannable);  

 

Java代码  

/** 

     * 带有\n换行符的字符串都可以用此方法显示2种颜色 

     * @param text 

     * @param color1 

     * @param color2 

     * @return 

     */  

    public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){  

        SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串  

        CharacterStyle span_0=null,span_1=null,span_2;  

        int end=text.indexOf("\n");  

        if(end==-1){//如果没有换行符就使用第一种颜色显示  

            span_0=new ForegroundColorSpan(color1);  

            spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        }else{  

            span_0=new ForegroundColorSpan(color1);  

            span_1=new ForegroundColorSpan(color2);  

            spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

            spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

              

            span_2=new AbsoluteSizeSpan(fontSize);//字体大小  

            spannable.setSpan(span_2, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        }  

        return spannable;  

    }  

 

c)首行缩进

 

方式一:(推荐)

setText("\u3000\u3000"+xxxxx);

方式二:这种方式不同分辨率会有问题

setText(" "+xxxxx);


半角:\u0020

全角:\u3000


2EditText

 (1)EditText中输入表情图像,如QQ

添加图片主要用SpannableStringImageSpan类: 

Java代码  

Drawable drawable = getResources().getDrawable(id);  

        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  

        //需要处理的文本,[smile]是需要被替代的文本  

        SpannableString spannable = new SpannableString(getText().toString()+"[smile]");  

        //要让图片替代指定的文字就要用ImageSpan  

        ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  

        //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(startend)  

//最后一个参数类似数学中的集合,[5,12)表示从512,包括5但不包括12  

        spannable.setSpan(span, getText().length(),getText().length()+"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    

        setText(spannable);  

 

 

 

下面给出一个类,专门用于将指定的文字转换成表情显示,当然使用前表情图片需要先导入drawable,另外表情图片的数量需要和数组定义的长度一致!否则抛参数异常。 

Java代码  

import android.content.Context;  

import android.text.Spannable;  

import android.text.SpannableStringBuilder;  

import android.text.style.ImageSpan;  

import android.util.Log;  

import java.util.HashMap;  

import java.util.regex.Matcher;  

import java.util.regex.Pattern;  

  

public class SmileyParser {  

    private Context mContext;  

    private String[] mSmileyTexts;  

    private Pattern mPattern;  

    private HashMap<String, Integer> mSmileyToRes;  

    public static final int[] DEFAULT_SMILEY_RES_IDS = {  

        R.drawable.aini,  

        R.drawable.aoteman,  

        R.drawable.baibai,  

        R.drawable.baobao,  

        R.drawable.beiju,  

        R.drawable.beishang,  

        R.drawable.bianbian,  

        R.drawable.bishi,  

        R.drawable.bizui,  

        R.drawable.buyao,  

        R.drawable.chanzui,  

    };  

  

    public SmileyParser(Context context) {  

        mContext = context;  

        mSmileyTexts = mContext.getResources().getStringArray(DEFAULT_SMILEY_TEXTS);  

        mSmileyToRes = buildSmileyToRes();  

        mPattern = buildPattern();  

    }  

  

    public static final int DEFAULT_SMILEY_TEXTS = R.array.default_smiley_texts;  

  

    private HashMap<String, Integer> buildSmileyToRes() {  

        if (DEFAULT_SMILEY_RES_IDS.length != mSmileyTexts.length) {  

//          Log.w("SmileyParser", "Smiley resource ID/text mismatch");  

            //表情的数量需要和数组定义的长度一致!  

            throw new IllegalStateException("Smiley resource ID/text mismatch");  

        }  

  

        HashMap<String, Integer> smileyToRes = new HashMap<String, Integer>(mSmileyTexts.length);  

        for (int i = 0; i < mSmileyTexts.length; i++) {  

            smileyToRes.put(mSmileyTexts[i], DEFAULT_SMILEY_RES_IDS[i]);  

        }  

  

        return smileyToRes;  

    }  

  

    //构建正则表达式  

    private Pattern buildPattern() {  

        StringBuilder patternString = new StringBuilder(mSmileyTexts.length * 3);  

        patternString.append('(');  

        for (String s : mSmileyTexts) {  

            patternString.append(Pattern.quote(s));  

            patternString.append('|');  

        }  

        patternString.replace(patternString.length() - 1, patternString.length(), ")");  

  

        return Pattern.compile(patternString.toString());  

    }  

  

    //根据文本替换成图片  

    public CharSequence replace(CharSequence text) {  

        SpannableStringBuilder builder = new SpannableStringBuilder(text);  

        Matcher matcher = mPattern.matcher(text);  

        while (matcher.find()) {  

            int resId = mSmileyToRes.get(matcher.group());  

            builder.setSpan(new ImageSpan(mContext, resId),matcher.start(), matcher.end(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

        }  

        return builder;  

    }  

}  

 

res/arrays.xml中添加数组: 

Xml代码  

<?xml version="1.0" encoding="UTF-8"?>  

<resources xmlns:android="http://schemas.android.com/apk/res/android"  

    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">  

  <string-array name="default_smiley_texts">  

    <item >[爱你]</item>  

     <item >[机器人]</item>  

    <item >[拜拜]</item>  

    <item >[抱抱]</item>  

    <item >[悲剧]</item>  

    <item >[悲伤]</item>  

    <item >[便便]</item>  

    <item >[鄙视]</item>  

    <item >[闭嘴]</item>  

    <item >[不要]</item>  

    <item >[馋嘴]</item>   

  </string-array>  

</resources>  

 

使用: 

Java代码  

public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

  

        TextView tvShow = (TextView) findViewById(R.id.tvShow);  

        TextView tvSource = (TextView) findViewById(R.id.tvSource);  

          

        SmileyParser parser = new SmileyParser(this);  

        String text = "[鄙视][爱你][便便][馋嘴][机器人]";  

        tvSource.setText("原文:"+text);  

        tvShow.setText(parser.replace("SmileyParser类处理后:"+text));  

    }  

 

TextView与输入法
1.输入法enter键监听

city = (EditText)findViewById(R.id.add_activity_city_name);

city.setOnEditorActionListener(this);

2.显示隐藏输入法

//显示

Public void showInutKey(){

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

   imm.showSoftInput(city, imm.SHOW_FORCED);

}

或者配置Manifest

 <activity android:name="com.ccp.wj.doit.ui.AddCityActivity" android:windowSoftInputMode="stateHidden"></activity>

 

//隐藏

public void hideInputKey(){

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

imm.hideSoftInputFromWindow(city.getWindowToken(),0);

}

3.监听文本变化

city.addTextChangedListener(new TextWatcher(){

 

@Override

public void afterTextChanged(Editable s) {

// TODO Auto-generated method stub

}

 

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

// TODO Auto-generated method stub

}

 

@Override

public void onTextChanged(CharSequence s, int start, int before,

int count) {

// TODO Auto-generated method stub

}

});

 

2.按钮组件

Button

1)动态改变按钮位置

ButtonView的子类,所以可以调用view.layout()方法实现改变大小和位置

ImageButton

单项选择RadioButton

 

3.图像组件

1)ImageView

A.如何显示图像的一部分

1.使用剪切资源

   在drawable中新建一个xml文件,选择<clip>标签创建剪切图像资源,然后使用代码来设置剪切百分比--drawable.setLevel(300);截取30%,因为系统预定义1000100%,以下代码实现截取图像的30%

ImageView iv = (ImageView)findViewById(R.id.iv);

ClipDrawable cD = (ClipDrawable)iv.getDrawable();

cD.setLevel(300);

2.使用createBitmap创建新的剪切图像

Bitmap bmp = Bitmap.createBitmap(soruceBitmap,20,20,100,100);

 

如何拉伸图片

设置android:scalType可以设置图片的显示尺寸,其中相关属性如下

Enum Values

ImageView.ScaleType 

CENTER 

Center the image in the view, but perform no scaling. 

ImageView.ScaleType 

CENTER_CROP 

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). 

ImageView.ScaleType 

CENTER_INSIDE 

Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding). 

ImageView.ScaleType 

FIT_CENTER 

Scale the image using CENTER

ImageView.ScaleType 

FIT_END 

Scale the image using END

ImageView.ScaleType 

FIT_START 

Scale the image using START

ImageView.ScaleType 

FIT_XY 

使用填充来拉伸,

ImageView.ScaleType 

MATRIX 

使用图像矩阵来拉伸

 

4.进度条组件

1)修改进度条的背景色

drawable中新建一个图像资源为<layer-list>标签的文档,因为layer-list是一个存储drawable的数组,其中按数组顺序进行图层排序,所以数组中最大的一个元素即在最顶层。 

所以,如果要更改进度条背景就需要按如下顺序在layer-list中声明<item>,背景色在底,第一级进度条在top

 

进度条有3种背景色

 

@android:id/background--@android:id/secondaryProgress--@android:id/progress

|----背景色-----------------|---------第二级进度条色-|-------第一级进度条色-------|

源代码

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item 

android:id="@android:id/background

android:drawable="@android:drawable/scrubber_track_holo_light"/>

<item android:id="@android:id/secondaryProgress">

    <scale 

        android:scaleWidth="100%" 

      android:drawable="@android:drawable/scrubber_secondary_holo"/>

</item>

<item android:id="@android:id/progress">

<scale 

    android:scaleWidth="100%"

    android:drawable="@android:drawable/scrubber_primary_holo"/>

</item>

</layer-list>

 

 

示例代码

Res/drawable/progress.xml--一级进度色

<?xml version="1.0" encoding="utf-8"?>

<clip xmlns:android="http://schemas.android.com/apk/res/android" >

   <shape>

     <corners android:radius="5dp"></corners>

     <size android:height="1dp"></size>

<gradient android:startColor="@color/maize"

       android:endColor="#FA8072"/>

</shape>

</clip>

注:如果图像drawable资源用的不是图片是纯色或者shape,必须<clip>指定为剪切资源,否则将会直接将背景色覆盖且不会再动因为图像已经把progress填充了。系统会更具图像的大小来计算进度条的进度。

Res/drawable/secondary_progress

<?xml version="1.0" encoding="utf-8"?>

<clip xmlns:android="http://schemas.android.com/apk/res/android" >

    <shape>

     <corners android:radius="5dp"></corners>

     <size android:height="1dp"></size>

<gradient android:startColor="@color/Coral"

       android:endColor="@color/Tomato"/>

</shape>

</clip>

 

Res/drawable/background--背景色

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <corners android:radius="5dp"></corners>

    <solid android:color="@color/black"/>

    <size android:height="1dp"></size>

</shape>

Res/drawable/progress_bar.xml--进度条的progressDrawable

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 设置进度条的背景色 -->

    <item android:id="@android:id/background"

         android:drawable="@drawable/background"></item>

     <!-- 设置进度条的一级背景色 -->

<item android:id="@android:id/secondaryProgress"

     android:drawable="@drawable/secondary_progress"></item>

 <!-- 设置进度条的一级背景色 -->

<item android:id="@android:id/progress"

    android:drawable="@drawable/progress">

</item>

</layer-list>

5.列表组件

5.1  ListView--列表

5.1.1如何让ListView的最后一个Item项现实分割线

----整个布局必须为RelativeLayout

5.1.2 适配器

要想在ListView输出数据,需为其添加适配器,这里适配器好比数据域ListView控件之间的桥梁,ListView通过适配器输出数据

适配器

(1)ArrayAdapter

behindList.setAdapter(new ArrayAdapter<String>(this,R.layout.text_view_item_1,R.id.text,new String[]{"1hellow","2how","3are"}));

(2)SimpleAdapter

构造函数

Public SimpleAdapter(Context context,List<?extends Map<Sting,?>>data,int resource, String []from, int[]to)

 

注:要对listview的item操作,如果item是在一个布局如RelativeLayout之中的RelativeLayout中,则需要对内部的RelativeLayout操作而不是外部操作

相关代码:

public View getView(int position, View convertView, ViewGroup group) {

// TODO Auto-generated method stub

ViewHolder holder =null;

RelativeLayout item = null;

//要对listview的item操作,如果item是在一个布局如RelativeLayout之中的RelativeLayout中,则需要对内部的RelativeLayout操作而不是外部操作

if(convertView == null){

convertView = LayoutInflater.from(mContext).inflate(R.layout.detail_setting_list_itemnull);

holder = new ViewHolder();

item = (RelativeLayout) convertView.findViewById(R.id.detail_list_item);

RelativeLayout.LayoutParams params = (LayoutParams) item.getLayoutParams();

if(params!=null){

params.height = ScreenUtils.height/10;

item.setLayoutParams(params);

}

//holder.weatherImg = (ImageView) convertView.findViewById(R.id.curWeather);

holder.moreSet = (ImageTextView) convertView.findViewById(R.id.more_setting);

holder.mainText = (TextView)convertView.findViewById(R.id.main_text);

holder.tipText = (TextView)convertView.findViewById(R.id.tip_text);

holder.switcher = (Switcher)convertView.findViewById(R.id.swithcer);

convertView.setTag(holder);//将view与holder联系起来

}

else{

holder = (ViewHolder) convertView.getTag();

}

HashMap<String,ArrayList<Object>> map = (HashMap<String, ArrayList<Object>>) list.get(position);

ArrayList<Object> object = map.get(key[position]);

    String mainText = (String) object.get(0);

    String tipText = (String) object.get(1);

    boolean isSwitcher = (Boolean)object.get(2);

    boolean isSwitcherOn = (Boolean)object.get(3);

    int id = (Integer)object.get(4);

   // int Id = Integer.parseInt(id);

    holder.mainText.setText(mainText);

    holder.tipText.setText(tipText);

   //如果是switcher不是imageButton

    if(isSwitcher){

     holder.switcher.setVisibility(View.VISIBLE);

    

    

     holder.switcher.setId(id);//设置id好标识事件响应时的区分控件

     holder.switcher.setOnSwitcherStateChangedListener(this,holder.switcher);

     if(isSwitcherOn)

     holder.switcher.setState(true);

     else holder.switcher.setState(false);

     holder.moreSet.setVisibility(View.GONE);//如果是switcher则是更多imagebutton消失

    

    }

    else{

    

     holder.switcher.setVisibility(View.GONE);

     holder.moreSet.setVisibility(View.VISIBLE);

     holder.moreSet.setId(id);

     holder.moreSet.setOnClickListener(this);

     boolean state = sp.getBoolean(StringHelper.SETTING_AUTO_REFRESHtrue);

     if(!state)

     item.setEnabled(false);

    }

    //convertView.setId(id);

   // convertView.setOnClickListener(this);

return convertView;

}

 

Xmlitem布局

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:widget="http://schemas.android.com/apk/res/com.ccp.wj.doitweatherforcast"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/RelativeLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:layout_marginBottom="5dp"

    android:background="@drawable/textview_click_normal"

    android:orientation="vertical" >

 

    <RelativeLayout

        android:id="@+id/detail_list_item"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentLeft="false"

        android:layout_alignParentRight="false"

        android:layout_alignParentTop="false"

        android:background="@drawable/textview_click_normal" >

 

        <TextView

            android:id="@+id/main_text"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentLeft="true"

            android:layout_alignParentTop="false"

            android:layout_centerVertical="true"

            android:paddingLeft="5dp"

            android:text="自动定位"

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

            android:textStyle="normal"

            android:typeface="normal" />

 

   <!--     <ImageButton

            android:id="@+id/more_setting"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentRight="true"

            android:layout_alignParentTop="false"

            android:layout_centerInParent="true"

            android:layout_marginRight="5dp"

            android:background="@color/transparent"

            android:src="@drawable/setting_more_1"

            android:visibility="gone" />

 --> 

 

 <com.ccp.wj.doit.myWidget.ImageTextView

     android:id="@+id/more_setting"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:layout_alignParentRight="true"

     android:layout_centerVertical="true"

     android:layout_marginRight="5dp"

     android:src="@drawable/setting_more_1"

     android:text="一小时" >

 

</com.ccp.wj.doit.myWidget.ImageTextView>

<com.ccp.wj.doit.myWidget.Switcher

    android:id="@+id/swithcer"

    android:layout_width="65dp"

    android:layout_height="30dp"

    android:layout_alignParentRight="true"

    android:layout_centerVertical="true"

    android:layout_marginRight="5dp"

    widget:default_state="false" />

 

<TextView

    android:id="@+id/tip_text"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignLeft="@id/main_text"

    android:layout_alignParentBottom="false"

    android:layout_below="@id/main_text"

    android:ellipsize="none"

    android:paddingLeft="5dp"

    android:text="kjhkjh"

    android:textSize="10sp" />

 

</RelativeLayout>

</RelativeLayout>

注:如上述适配器中convertView是一个RelativeLayoutitem是包含在convertView中的一个RelativeLayout,所以如果要对item进行操作,则是对item进行,而不是convertView;当然如果xml布局文件中只有一个单一的布局如RelativeLayout,则可以直接对convertView操作

 

 

2)xml属性详解

<ListView

    android:id="@+id/dialog_list"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_below="@+id/dialog_title" 

    android:divider="@drawable/dotted_line"

    android:scrollbarThumbVertical="@drawable/scrollbar_thumb_a"

     android:scrollbarTrackVertical="@drawable/scrollbar_thumb_a" >

<!-- 设置scrollbar的短条样式 -->

</ListView>

注:dividertextView之间的分割线样式图片,scrollbarThumbVerticalscrollbarTrackVertical分别是短条和长条的图片样式

5.1.3 ListView的内容不能完全显示

 1)思路:重新设置ListViewItemLayoutParams,根据Item具体所需要的高度,重设Item的高度

  2)例:在ListView中显示ListView

//更改嵌入的ListView的高度,使其显示内容完全,其中contentDetail是嵌入ListView的ListView

params = mHolder.contentDetail.getLayoutParams();//获取嵌入的ListView的LayoutParams

mListAdapter = mHolder.contentDetail.getAdapter();//获取ListView的适配器

int count = mListAdapter.getCount();//获取嵌入的ListView的item个数

tvParams = mHolder.itemContent.getLayoutParams();//获取嵌入ListView的item中的TextView的LayoutParams

int height = tvParams.height;//获取tv的高度

int dividerH = mHolder.contentDetail.getDividerHeight();//获取分割线的宽度

params.height = count*height+(count-1)*dividerH;

mHolder.contentDetail.setLayoutParams(params);//重置嵌入ListView作为item的LayoutParams

法2

ViewGroup.LayoutParams params = mHolder.itemDetail.getLayoutParams();

LinearLayout item = (LinearLayout) mHolder.itemLayout.findViewById(R.id.main_item_item_layout);

item.measure(0, 0);//测量item的宽和高,必须先测量才能由getMeasuredHeight()获取高度

int h = item.getMeasuredHeight();

int c = list.size();

int divideH = mHolder.itemDetail.getDividerHeight();

int totleH = c*h+(c-1)*divideH;

params.height = totleH;

mHolder.itemDetail.setLayoutParams(params);

5.1.4 ListView实现圆角Item--微信中的item实现

1)所需文件

 圆角图片或者shape文件实现圆角

 

Listview的布局文件

<ListView

        android:id="@+id/main_content_item_list"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="5dp"

        android:background="@color/transparent"

        android:cacheColorHint="@null"

        android:divider="@android:color/transparent"

        android:dividerHeight="10dp"

        android:listSelector="@android:color/transparent" >

    </ListView>

注:backgroud设为透明的原因:去掉圆角后面的突出

Item项的布局

<LinearLayout

        android:id="@+id/main_item_item_layout"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:background="@drawable/list_item_sel"

        android:orientation="vertical" >

        <TextView

            android:id="@+id/main_item_content"

            android:layout_width="match_parent"

            android:layout_height="50dp"

            android:layout_marginLeft="5dp"

            android:ellipsize="end"

            android:gravity="center_vertical"

            android:singleLine="true"

            android:text="TextView"

            android:textColor="@color/black"

            android:textSize="20sp" />

        <TextView

            android:id="@+id/main_item_time"

            android:layout_width="wrap_content"

            android:layout_height="20dp"

            android:layout_gravity="right"

            android:layout_marginBottom="5dp"

            android:layout_marginRight="5dp"

            android:gravity="center_vertical"

            android:text="TextView"

            android:textColor="@color/black"

            android:textSize="15sp" />

    </LinearLayout>

 

5.1.5 listview跳至指定的position

mContentList.setSelection(position)

5.1.6 改变listViewscrollbar的滑动条样式

try { 
Field f = AbsListView.class.getDeclaredField("mFastScroller"); 
f.setAccessible(true); 
Object o=f.get(listView); 
f=f.getType().getDeclaredField("mThumbDrawable"); 
f.setAccessible(true); 
Drawable drawable=(Drawable) f.get(o); 
drawable=getResources().getDrawable(R.drawable.icon); 
f.set(o,drawable); 
Toast.makeText(this, f.getType().getName(), 1000).show(); 
} catch (Exception e) { 
throw new RuntimeException(e); 
}


ListView中添加属性:
android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track" android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"

scrollbar_vertical_trackcrollbar_vertical_thumb自定义的xml文件,放在Drawable中,track是指长条,thumb是指短条,然后再xml中定义短条和长条的样式

 

5.1.7 ListViewOnItemClickListener只能响应一次,第二次不能响应

原因:被ListView的子View抢夺了焦点,如自定义ListView时的单个Item中有两个需要获取焦点的LinearLayoutListView,如果ListView设置不可见,当点击了LineaLayoutListView可见,此时ListView会抢夺掉LinearLayout的焦点,所以会出现第二次点击LinearLayout时不能监听到。

解决:

 android:descendantFocusability="blocksDescendants"

设置该属性设置继承的焦点,有

blocksDescendants:阻塞继承焦点,即自View不能获取焦点

beforDescendants:

afterDescendants:

6.多项选择CheckBox

相关函数isChecked()

下拉列表------Spinner

SpinnerSpinner是个窗口小部件,像一个下拉选择菜单。本教程里,将创建一个Spinner小部件来显示一个行星列表。当选择了某一项,会弹出一个文本消息框显示选中的项。创建工程:HelloSpinner.打开res/layout/main.xml并修改如下

Spinner

Spinner是个窗口小部件,像一个下拉选择菜单。

本教程里,将创建一个Spinner小部件来显示一个行星列表。当选择了某一项,会弹出一个文本消息框显示选中的项。

1.打开res/layout/main.xml并修改如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    ............

    <Spinner 

        android:id="@+id/spinner"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:prompt="@string/planet_prompt"

    />

</LinearLayout>

Spinnerandroid:prompt属性引用了相同的字符串资源,对Spinner来说,它是下拉选择框上的一个提示。

打开res/values/ 下面的strings.xml文件,在里面插入以下内容(在<resources></resources>之间):

<string name="planet_prompt">Choose a planet</string>

    <string-array name="planets_array">

        <item>Mercury</item>

        <item>Venus</item>

        <item>Earth</item>

        <item>Mars</item>

        <item>Jupiter</item>

        <item>Saturn</item>

        <item>Uranus</item>

        <item>Neptune</item>

    </string-array>

<string>

标签定义了Spinner 都要用到的字符串资源。<string-array>定义了一个字符串的列表,将显示在Spinner的下拉框里。

修改onCreate()方法如下:

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    Spinner spinner = (Spinner) findViewById(R.id.spinner);

    ArrayAdapter<CharSequence>adapter=ArrayAdapter.createFromResource(this,R.array.planets_array,android.R.layout.simple_spinner_item);  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinner.setAdapter(adapter);

}

在加载了main.xml布局文件之后,通过findViewById(int)方法获得了对Spinner的引用。再通过createFromResource() 方法创建一个ArrayAdpater,用来将字符串数组资源绑定到Spinner上(这就是为什么字符串数组的内容会显示在Spinner的下拉框里)。资源ID R.array.planets_array 用来引用在前面strings.xml里定义的字符串数组资源,android.R.layout.simple_spinner_item用来引用系统自定义的一个标准的Spinner外观。再调用setDropDownViewResource(int id)方法来定义Spinner下拉框里每一项的外观(simple_spinner_dropdown_item 

另一个系统自定义的标准外观)。

现在创建一个内嵌类来实现AdapterView.OnItemSelectedListener监听器,提供一个回调函数来处理Spinner的选择事件。这个类内容如下:

 public class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,

        View view, int pos, long id) {

      Toast.makeText(parent.getContext(), "The planet is " +

          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();

    }

    public void onNothingSelected(AdapterView parent) {

      // Do nothing.

    }

}

AdapterView.OnItemSelectedListener

监听器需要实现onItemSelected() 和 onNothingSelected() 两个回调函数,前者处理下拉框里的一项被选中的情况,弹出一个文本框显示被选中的项;后者处理下拉框打开并关闭后什么也没选的情况,这时什么也没发生,所以什么也不做。

现在给Spinner设置上面实现的监听器。在onCreate()末尾添加下面的内容:

spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

创建一个匿名的MyOnItemSelectedListener 实例并设置为Spinner的监听器。

 

自动提示---AutoCompleteTextView

输入文本会提示相关的信息

 

相关代码:

 

android:completionThreshold="1" ---completionThreshold声明在输入多少字符(阀值)后弹出下拉框 

解惑:

1Adapter(适配器)

相当于数据与控件(View----ListView----Spinner)之间的桥梁

(2)setDropDownViewResource(android.R.layout.simple_spinner_item);

将视图资源加入下拉视图中

(3)createFromResource()从尾部创建一个ArrayAdapter对象

9.DataPicker TimePicker

10.容器组件

GridView

格子视图,用于图片格子显示。==重点:创建自己的适配器

关于适配器继承子BaseAdapter,重要的是getView代码如下:

public class ImageAdapter extends BaseAdapter {

private Context context;

public ImageAdapter(Context context){

this.context = context;

}

@Override

public View getView(int position, View convertView, ViewGroup parent){

// TODO Auto-generated method stub

ImageView imageview;

if(convertView==null){

imageview = new ImageView(context);

imageview.setLayoutParams(new GridView.LayoutParams(85, 85));

imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);

imageview.setPadding(4, 4,4, 4);

}

else imageview = (ImageView)convertView;

imageview.setImageResource(imageId[position]);

return imageview;

}

 

}

 

 

1.添加额外要单独显示的一个图标

原理:在getView中再调用一次getView,且getCount()返回list.size+1;

getView()返回一个gridview块组件,getCount()返回块组件的个数

效果如下

 

注:此处的“+”即被按下的那个图案,是多加上去的

if(position == list.size()){

convertView = LayoutInflater.from(mContext).inflate(R.layout.grid_view_item_plus, null);

return convertView;

}

使item不混乱

有额外的item项要单独显示,如在上述中添加一个‘添加’的item项,因为对于此项getView调用了3次,所以需要将栈中的这3convertView=null

 

if(isFirst&&convertView!=null){

if(count<3){//将’+‘图形的那三个convertView = null

convertView = null;

}

else

count++;

}

2.关于getView

@Override

public View getView(int position, View convertView, ViewGroup group) {

// TODO Auto-generated method stub

//添加’添加图标‘+

if(position == list.size()){

convertView = LayoutInflater.from(mContext).inflate(R.layout.grid_view_item_plus, null);

return convertView;

}

ViewHolder holder;

if(convertView == null){

convertView = LayoutInflater.from(mContext).inflate(R.layout.grid_view_item, null);

holder = new ViewHolder();

holder.weatherImg = (ImageView) convertView.findViewById(R.id.curWeather);

holder.curCity = (TextView)convertView.findViewById(R.id.curCity);

holder.curTemp = (TextView)convertView.findViewById(R.id.curTemp);

convertView.setTag(holder);//viewholder联系起来

}

else{

holder = (ViewHolder) convertView.getTag();

}

HashMap map = list.get(position);

ArrayList cityDetail = (ArrayList) map.get("cityDetail");

String city = (String) cityDetail.get(0);//

String temp = (String)cityDetail.get(1);

int imgId = (Integer)cityDetail.get(2);

    holder.weatherImg.setImageResource(imgId);

holder.curCity.setText(city);

holder.curTemp.setText(temp);

return convertView;

}

注:其中convertView翻译过来为转化视图的意思,这是因为,当item过多时会印象运行速度,超过了一定限制,就会将前面一inflateitem向的View一如recycle中直接拿来使用而不需要再次inflate新的View,这样将大大提高运行效果

注:ViewHolder的作用是缓存convertView的数据,通过setTag()将convertViewholder联系起来,对holder操作即对convertView的操作

注:如何使得控件改变----notifyDataSetChanged()实现更新getView中的视图

注:ViewHolder:保存视图中上一个的视图,通过setTagtag)将自己与对方连接起来,与id有异曲同工之妙

3.刷新--notifyDataSetChanged使用

使用notifyDataSetChanged()刷新,必须在Adapter内部

A.在Adapter中设置一个外部接口供外部更改Adapter中的数据,

B.在接口中调用notifyDataSetChanged();

/**

 * 外部接口

 */

public void changeDataSet(HashMap<String,ArrayList<Object>>map){

list.add(map);

this.notifyDataSetChanged();

}

 

如何实现可拖动的gridview

原理:通过继承ViewGroup实现新的控件,并在其中添加各种监听和实现拖动

 

11.Menu

 

一.OptionsMenu

 

1.创建步骤:

menuxml文档有MenuInflater 实例化

覆盖onCreateOptionMenu()方法,调用inflate方法将菜单和实例化的menuxml连接起来

菜单项响应事件添加覆盖onOptionsItemSelected(MenuItem)

代码如下:

@Override

public boolean onCreateOptionsMenu(Menu menu) {

  MenuInflater inflater = getMenuInflater();

  inflater.inflate(R.menu.game_menu, menu);   

  return true;

}

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    // 响应菜单项被选   

    switch (item.getItemId()) {

        case R.id.new_game:  newGame(); return true; 

        case R.id.help:showHelp();  return true;

        default:return super.onOptionsItemSelected(item);   

     }

}

2.与Activity关联

MenuItem item = menu.add();

item.setIntent(intent);

二.ContextMenu

 

1.创建ContextMenu菜单代码

Override

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo){    

    super.onCreateContextMenu(menu, v, menuInfo);

  MenuInflater inflater = getMenuInflater();

  inflater.inflate(R.menu.context_menu, menu);

}

 

@Override

public boolean onContextItemSelected(MenuItem item) {    

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();    

    switch (item.getItemId()) {        

    case R.id.edit:     editNote(info.id);  return true; 

    case R.id.delete:   deleteNote(info.id);   return true;

    default:          return super.onContextItemSelected(item);   

 }

}

 

 

如何添加ContextMenu

通过public void registerForContextMenu (View view)方法实现为需添加ContextMenuView添加ContextMenu

 

 

 

2创建Context ActionBar--当选择一个item,标题栏变为一个队此item操作相关的操作菜单,覆盖了标题栏,与ActionBar是独立的(3.0及以上使用此而不是ContextMenu

注:用于长按,或check了与CheckBox类似的控件,弹出一个ContextActionBar

创建代码如下

实现ActionMode.Callback

 

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

  // Called when the action mode is created; startActionMode() was called    @Override

      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 

         // 实例化一个菜单

         MenuInflater inflater = mode.getMenuInflater();        

         inflater.inflate(R.menu.context_menu, menu); 

         return true;    }

    @Override

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {        return false; // Return false if nothing is done    }

  // Called when the user selects a contextual menu item

      @Override    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

          switch (item.getItemId()) {

              case R.id.menu_share:    shareCurrentItem();            

              mode.finish(); // Action picked, so close the CAB   

            return true;

              default:   return false;

          }

      }

  // Called when the user exits the action mode 

   @Override

  public void onDestroyActionMode(ActionMode mode){

          mActionMode = null; 

     }

  };

 

调用startActionMode()ContextActionBar显示出来

mActionMode = getActivity().startActionMode(mActionModeCallback);

 

ListView设置多选

.

实现AbsListView.MultiChoiceModelistener

ListView对象调用setMultiChoiceModeListener()

实现ActionMode.Callback

ListView对象调用setChoiceModeChoice_MODE_MULTIPLE_MODAL)设置多选

 

 

 

三.PopupMenu--用于点击某个控件弹出一个操作菜单在控件上方或下方(API11)

 

创建代码

protected void createPopupMenu(View v) {

// TODO Auto-generated method stub

PopupMenu pM = new PopupMenu(this,v);

pM.getMenuInflater().inflate(R.menu.activity_main, pM.getMenu());

pM.show();

}

 

public void showMenu(View v) {

    PopupMenu popup = new PopupMenu(this, v);

  // This activity implements OnMenuItemClickListener

      popup.setOnMenuItemClickListener(this);

      popup.inflate(R.menu.actions);

      popup.show();

  }

@Override

public boolean onMenuItemClick(MenuItem item) {

  switch (item.getItemId()) {

          case R.id.archive: archive(item);            return true;

          case R.id.delete:  delete(item);            return true;

          default:   return false; 

     }

  }

 

 

 

 

12.ListView-------列表视图

 

13.Dialog

1.在当前Activity创建一个对话框

关键在于有AlertDialog.Builder类的对象来创建一个对话框,代码如下

 

(1)由AlertDialog.Builder创建一个对话框

(2)可将自己设计的Activity转化为ViewsetView转换为为对话框设置View

(3)由setPositiveButtonsetNegativeButtonsetNeutralButton设置中间键

注:由LayoutInflater的对象调用inflater方法将布局文件转化为View,然后又builder.setView()与对话框连接起来

2.独立于Activity创建一个对话框

1)原理:因为如果对话框没有他相对的Activity则不能创建一个Dialog,所以必须通过getWindow()方法获取当前一个Window对象,并可设置相关属性,然后就可以再当前的Window-Activity上建立对话框了。

2)方式:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  

注:就是一个AlertDialog,焦点在当前Dialog
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> 

注:这个类型对话框焦点在当前Activity上,我们仍可以操作当前Activity

(1)所需类:WindowManager

(2)获取Window对象:getWindow()

(3)设置窗口相关属性:Manager.LayoutParams

注:一定要加用户权限,设置窗口属性,需在Dialog.show之后

(3)如何定制自己的对话框

设置当前所获Window对象==>通过getAttributes()获取一个LayoutParams对象==>设置相关属性,如透明度,黑暗度,

获取一个WindowManagergetSystemServiceWINDOW_SERVICE)),getDefaultDisplay()获取一个Display对象,即当前界面的长和宽

代码如下:

/**

 * 加载 加载对话框

 */

private void load() {

// TODO Auto-generated method stub

// ProgressDialog.Builder builder = new ProgressDialog.Builder(this);

// dialog= new ProgressDialog(this);

AlertDialog.Builder builder = new AlertDialog.Builder(this);

RelativeLayout view=

 (RelativeLayout) View.inflate(this, R.layout.progress_dilog_layout,null);

ImageView loading = (ImageView) view.findViewById(R.id.progress_dialog_image);

loading.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate));

builder.setView(view);

dialog = builder.create();

dialog.show();//必须要先show后才设置layout

Window w = dialog.getWindow();

w.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

WindowManager.LayoutParams wp = w.getAttributes();

wp.gravity = Gravity.CENTER;

wp.width = (int) (ScreenUtils.width*0.9);

wp.height = (int) (ScreenUtils.height *0.6);

w.setAttributes(wp);

}

 

注:

A)获取屏幕高和宽

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

Display screen= wm.getDefaultDisplay();//获取屏幕的长和宽

LayoutParams layout = window.getAttributes();

B.如果要改变dialog的布局,如显示到屏幕中间,必须要先dialog.show()之后设置window.setAttibutes(layout)才有效。

C)背景色填充不满的问题

dialog.setView(view,0,0,0,0)解决

3.管理和使用Dialog

覆盖onPrepareDialogid)和onCreateDialog(id,dlg)事件处理函数来管理和维护对话框实例

showDialog(id)来显示对话框

4.自定义何时关闭对话框-使用反射技术

2.使对话框不消失

关键字是Dialog类的mShowing字段

Field field

 = dialog.getClass().getSuperclass().getDeclaredField("mShowing");

field.setAccessible(true); 

field.set(dialogfalse);//设置false来欺骗系统已经关闭了对话框

Dialog.dismiss();//最后还要调用dismiss来关闭对话框

注:通过设置mShowing字段可以控制对话框的消失与显示。将set()中设为true即可消失

5.设置对话框背景色

<!-- Dialog -->

<style  

        name="myDialog"  parent="@android:style/Theme.Dialog">  

        <item name="android:windowFrame">@null</item><!--边框-->  

        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->        

         <item name="android:windowNoTitle">true</item><!--无标题--> 

        <item name="android:windowBackground">@drawable/dialog_shap_bg</item><!--背景透明-->      

</style> 

 

 

或者代码设置

       Window w = dialog.getWindow();

w.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

w.setBackgroundDrawableResource(R.drawable.dialog_shap_bg);

注:重要的是windowBackground属性,它将设置对话框最底部的window的背景色,这样就不会出现通过setViewview)设置出来后背景是黑色的。我们最好是直接设置window的背景而不是view的背景

 

屏幕相关

1.全屏显示

requestWindowFeatureWindow.FEATURE_NO_TITLE;//要求屏幕无标题栏

注:这条代码必须在setContentView()之前

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//获取当前窗口并设置为全屏模式

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)//设置为横屏

2.获取屏幕的属性

(1) WindowManager manager = getWindowManager();

Display display = manager.getDefaultDisplay();

Float width = display.getWidth()

Flaot height = display.getHeight();

(2)  WindowManager manager = getWindowManager();

DisplayMetrix matrix=new DisplayMetrix() ;

manager.getMetrix(metrix);

Float Width = matrix.widthPixells;

Float height  = matrix.heightPixels;

3.横竖屏切换

横竖屏切换回回调onConfigurationChanged(Configuration config)方法

代码如下:

@Override

Public void onConfigurationChanged(Configuration newConfigration){

If(this.getResources().getConfiguration.orentation == Configration.ORIENTATION_LANDSCAPE)//如果是横屏

Else if(this.getResources().getConfiguration.orentation == Configration.ORIENTATION_PORTRATE)//如果是竖屏

}

4.保持屏幕常亮

5.获取状态栏

public static int getStatusBarHeight(View v){

Rect re = new Rect();

v.getWindowVisibleDisplayFrame(re);

int h = re.top;

return h;

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值