如何在用户停止操作一段时间后隐藏界面上的某些东东,比如遥控器按出的menu,一段时间不按遥控器就让menu消失
以前同事教我写过一个,后来在想的时候就想不起来了,脑袋不好使,逻辑思维又不强,像我这种只能把学到的都记下来,以后要用的时候在去找。
好了,说正题,遇到过这方面的问题。比如遥控器上面,我按menu键会弹出菜单,我在按menu键的时候菜单会消失,或者停止操作一段时间后菜单消失,又或者
遇到这种情况,一个Gallery上面,我想让选中某一项时,加载某些信息,或者执行某些操作,但我又想连续操作几次后才加载显示的信息,也就是说我可以缓慢滑动一
项,这时会加载,也可以快速滑动,滑动完后才加载。
下面说说用sendMessageDelay完成这种操作。
布局文件如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 android:gravity="center">
7 <ListView
8 android:id="@+id/mylist"
9 android:layout_width="match_parent"
10 android:layout_height="0dip"
11 android:layout_weight="1"
12 android:visibility="gone"/>
13 <TextView
14 android:text="@string/hint"
15 android:layout_width="match_parent"
16 android:layout_height="wrap_content"
17 android:textSize="24sp"
18 android:gravity="center"/>
19 </LinearLayout>
首先我们在布局中放一个ListView,Listview的下面放一个TextView,而ListView把剩下的空间全部充满,ListView刚开始的时候是gone掉的。TextView上面
主要显示的是一些提示的操作。
首先我们要处理按键操作,比如说我们在按“0”键的时候,如果ListView是显示的,那么我们把它gone掉,如果它是gone的,我们把它Visible出来,我们先写
一个方法来判断ListView是显示还是隐藏的,如下所示:
1 private boolean isVisible(ListView listView) {
2 int visibile = listView.getVisibility();
3 if(View.VISIBLE == visibile) {
4 return true;
5 } else if(View.GONE == visibile) {
6 return false;
7 } else {
8 return false;
9 }
10 }
如果ListView是visible的,我们返回为true,如果是gone的或者invisible什么其他的情况,我们返回为false。
好了,我们要开始对按键进行操作,我们重载Activity中的dispatchKey方法,在里面处理按键“0”和按键“上/下”的情况,如果ListView是Visible的,我们只
需要将ListView gone掉就可以了,如果ListView是gone掉的,我们就需要将它显示出来,同时要将ListView设上Adapter,如果我们按“上/下”键,在按键的时候
我们需要延迟2秒发送一个消息,这个消失是通知ListView gone掉的,在这之前我们需要将前一个消息remove掉,不然我们还在操作的时候ListView就会消失,我
们一直按,没有到2秒,它会把之前的那个消失remove掉,然后发新的消息,等我们不在操作了,最后的那个消息就发送成功了,ListView就会被gone掉。
我们看一下dispatchKey方法里面是怎么处理的:
1 public boolean dispatchKeyEvent (KeyEvent event) {
2 int keyCode = event.getKeyCode();
3 switch (keyCode) {
4 case KeyEvent.KEYCODE_0:
5 if(event.getAction() == KeyEvent.ACTION_UP) {
6 if(isVisible(mListView)) {
7 mListView.setVisibility(View.GONE);
8 } else {
9 mListView.setVisibility(View.VISIBLE);
10 setListAdapter(mThumbs);
11 mListView.requestFocus();
12 mListView.setSelection(0);
13 }
14 }
15 return true;
16
17 case KeyEvent.KEYCODE_DPAD_UP:
18 case KeyEvent.KEYCODE_DPAD_DOWN:
19 mHandler.removeMessages(msgKey1);
20 mHandler.sendEmptyMessageDelayed(msgKey1, 2000);
21 break;
22
23 default:
24 break;
25 }
26 return super.dispatchKeyEvent(event);
27 }
设置Adapter的方法:
1 private void setListAdapter (String[] mThumbs2) {
2 mAdapter = new ListViewAdapter(this, mThumbs2);
3 mListView.setAdapter(mAdapter);
4 }
Adapter单独写出来了一个类:
1 package com.test.handler;
2
3 import android.content.Context;
4 import android.view.Gravity;
5 import android.view.View;
6 import android.view.ViewGroup;
7 import android.view.ViewGroup.LayoutParams;
8 import android.widget.BaseAdapter;
9 import android.widget.ListView;
10 import android.widget.TextView;
11
12 public class ListViewAdapter extends BaseAdapter {
13
14 private Context mContext;
15 private String[] data;
16
17 public ListViewAdapter (Context context, String[] data) {
18 this.mContext = context;
19 this.data = data;
20 }
21
22 @Override
23 public int getCount () {
24 return data.length;
25 }
26
27 @Override
28 public Object getItem (int position) {
29 return position;
30 }
31
32 @Override
33 public long getItemId (int position) {
34 return position;
35 }
36
37 @Override
38 public View getView (int position, View convertView, ViewGroup parent) {
39 TextView tv;
40 if(convertView == null) {
41 tv = new TextView(mContext);
42 tv.setLayoutParams(new ListView.LayoutParams(LayoutParams.MATCH_PARENT, 50, Gravity.CENTER));
43 } else {
44 tv = (TextView)convertView;
45 }
46 tv.setTextSize(30);
47 tv.setGravity(Gravity.CENTER);
48 tv.setText(data[position]);
49 return tv;
50 }
51 }
传入Adapter的参数的值:
1 private String[] mThumbs = {
2 "CCTV-1",
3 "CCTV-2",
4 "CCTV-5",
5 "CCTV-6",
6 "CCTV-7",
7 "CCTV-10",
8 "CCTV-11",
9 "湖南卫视",
10 "湖北卫视",
11 "凤凰卫视",
12 "江西卫视",
13 "上海卫视",
14 "辽宁卫视",
15 "长春卫视",
16 "北京卫视"
17 };
Handler中处理将ListView消失掉:
1 private Handler mHandler = new Handler() {
2
3 public void handleMessage(android.os.Message msg) {
4 switch (msg.what) {
5 case msgKey1:
6 mListView.setVisibility(View.GONE);
7 break;
8
9 default:
10 break;
11 }
12 };
13 };
完整的Activity如下所示:
1 package com.test.handler;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.view.KeyEvent;
7 import android.view.View;
8 import android.widget.ListView;
9
10 import com.test.R;
11
12 public class HandlerActivity extends Activity {
13
14 private ListView mListView;
15 private ListViewAdapter mAdapter;
16 private static final int msgKey1 = 1;
17
18 private Handler mHandler = new Handler() {
19
20 public void handleMessage(android.os.Message msg) {
21 switch (msg.what) {
22 case msgKey1:
23 mListView.setVisibility(View.GONE);
24 break;
25
26 default:
27 break;
28 }
29 };
30 };
31
32 @Override
33 protected void onCreate (Bundle savedInstanceState) {
34 super.onCreate(savedInstanceState);
35 setContentView(R.layout.handler);
36 mListView = (ListView) findViewById(R.id.mylist);
37 }
38
39 private boolean isVisible(ListView listView) {
40 int visibile = listView.getVisibility();
41 if(View.VISIBLE == visibile) {
42 return true;
43 } else if(View.GONE == visibile) {
44 return false;
45 } else {
46 return false;
47 }
48 }
49
50 @Override
51 public boolean dispatchKeyEvent (KeyEvent event) {
52 int keyCode = event.getKeyCode();
53 switch (keyCode) {
54 case KeyEvent.KEYCODE_0:
55 if(event.getAction() == KeyEvent.ACTION_UP) {
56 if(isVisible(mListView)) {
57 mListView.setVisibility(View.GONE);
58 } else {
59 mListView.setVisibility(View.VISIBLE);
60 setListAdapter(mThumbs);
61 mListView.requestFocus();
62 mListView.setSelection(0);
63 }
64 }
65 return true;
66
67 case KeyEvent.KEYCODE_DPAD_UP:
68 case KeyEvent.KEYCODE_DPAD_DOWN:
69 mHandler.removeMessages(msgKey1);
70 mHandler.sendEmptyMessageDelayed(msgKey1, 2000);
71 break;
72
73 default:
74 break;
75 }
76 return super.dispatchKeyEvent(event);
77 }
78
79 private void setListAdapter (String[] mThumbs2) {
80 mAdapter = new ListViewAdapter(this, mThumbs2);
81 mListView.setAdapter(mAdapter);
82 }
83
84 private String[] mThumbs = {
85 "CCTV-1",
86 "CCTV-2",
87 "CCTV-5",
88 "CCTV-6",
89 "CCTV-7",
90 "CCTV-10",
91 "CCTV-11",
92 "湖南卫视",
93 "湖北卫视",
94 "凤凰卫视",
95 "江西卫视",
96 "上海卫视",
97 "辽宁卫视",
98 "长春卫视",
99 "北京卫视"
100 };
101 }
Adapter上面已经发了。
下面我们来看一下运行的效果吧。
因为是动态的,需要操作才能知道效果,我这里就截两张图吧。
一张是ListView消失的时候:
还有一张是ListView显示的时候:
代码我还是发上来吧,包里面很乱,都是写的测试程序,可以找到这个程序,在com.test.handler包里面,2个文件都是的。
下面给出下载地址: