zoukankan      html  css  js  c++  java
  • 如何在用户停止操作一段时间后隐藏界面上的某些东东,比如遥控器按出的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个文件都是的。

      下面给出下载地址:

      点击我下载

  • 相关阅读:
    在Perl里 对象就是hash引用
    第十二章 对象(上):
    连锁百货企业数据分析系统建设方案
    连锁百货企业数据分析系统建设方案
    java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
    通过Net::Ping 理解Perl的面向对象
    org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
    Attempt to refer to a unregistered pool by its alias 'dbpool'
    Error:[$parse:lexerr]
    keepalived 监测域名解析脚本
  • 原文地址:https://www.cnblogs.com/shang53880/p/2119695.html
Copyright © 2011-2022 走看看