精华内容
下载资源
问答
  • 另外还需要处理点击空白处和返回该键下拉菜单自动关闭。今天在eoe上无意看到popwindow也能实现这样的功能,而且根本不需要处理动画效果和空白处、返回点击自动关闭的功能。哎,看来我真的out了,直接上代码: ...

    别的不多说先上图吧



    以前做这样的功能,我都是自定义一个LinerLayout,然后控制它的隐藏和显示,还需要添加弹出和隐藏的动画效果。另外还需要处理点击空白处和返回该键下拉菜单自动关闭。今天在eoe上无意看到popwindow也能实现这样的功能,而且根本不需要处理动画效果和空白处、返回键点击自动关闭的功能。哎,看来我真的out了,直接上代码:


    这里是自定义的PopMenu 类,里面对popwindow进行了封装,实现下拉菜单的效果

    package com.su.testpopwindow;


    import java.util.ArrayList;


    import android.content.Context;
    import android.graphics.drawable.BitmapDrawable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    import com.su.testpopwindow.R;


    public class PopMenu {
    private ArrayList<String> itemList;
    private Context context;
    private PopupWindow popupWindow;
    private ListView listView;




    public PopMenu(Context context) {
    this.context = context;
    itemList = new ArrayList<String>();


    View view = LayoutInflater.from(context)
    .inflate(R.layout.popmenu, null);


    // 设置 listview
    listView = (ListView) view.findViewById(R.id.listView);
    listView.setAdapter(new PopAdapter());
    listView.setFocusableInTouchMode(true);
    listView.setFocusable(true);


    popupWindow = new PopupWindow(view, 100, LayoutParams.WRAP_CONTENT);
    popupWindow = new PopupWindow(view, context.getResources()
    .getDimensionPixelSize(R.dimen.popmenu_width),
    LayoutParams.WRAP_CONTENT);


    // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景(很神奇的)
    popupWindow.setBackgroundDrawable(new BitmapDrawable());
    }


    // 设置菜单项点击监听器
    public void setOnItemClickListener(OnItemClickListener listener) {
    listView.setOnItemClickListener(listener);
    }


    // 批量添加菜单项
    public void addItems(String[] items) {
    for (String s : items) {
    itemList.add(s);
    }
    }


    // 单个添加菜单项
    public void addItem(String item) {
    itemList.add(item);
    }


    // 下拉式 弹出 pop菜单 parent 右下角
    public void showAsDropDown(View parent) {
    popupWindow.showAsDropDown(parent,
    10,
    // 保证尺寸是根据屏幕像素密度来的
    context.getResources().getDimensionPixelSize(
    R.dimen.popmenu_yoff));


    // 使其聚集
    popupWindow.setFocusable(true);
    // 设置允许在外点击消失
    popupWindow.setOutsideTouchable(true);
    // 刷新状态
    popupWindow.update();
    }


    // 隐藏菜单
    public void dismiss() {
    popupWindow.dismiss();
    }


    // 适配器
    private final class PopAdapter extends BaseAdapter {


    @Override
    public int getCount() {
    return itemList.size();
    }


    @Override
    public Object getItem(int position) {
    return itemList.get(position);
    }


    @Override
    public long getItemId(int position) {
    return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
    convertView = LayoutInflater.from(context).inflate(
    R.layout.pomenu_item, null);
    holder = new ViewHolder();
    convertView.setTag(holder);


    holder.groupItem = (TextView) convertView
    .findViewById(R.id.textView);


    } else {
    holder = (ViewHolder) convertView.getTag();
    }


    holder.groupItem.setText(itemList.get(position));


    return convertView;
    }


    private final class ViewHolder {
    TextView groupItem;
    }
    }
    }


    这是主activity,点击button,弹出下拉菜单

    package com.su.testpopwindow;


    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.AdapterView.OnItemClickListener;


    public class TestPullPopWindowActivity extends Activity {
    private PopMenu popMenu;
    private Context context;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    context = TestPullPopWindowActivity.this;
    popMenu = new PopMenu(context);
    popMenu.addItems(new String[] { "停发", "延期", "删除", "备注", "修改","我们" });
    // 菜单项点击监听器
    popMenu.setOnItemClickListener(popmenuItemClickListener);


    Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {


    @Override
    public void onClick(View v) {
    popMenu.showAsDropDown(v);
    }
    });


    }


    // 弹出菜单监听器
    OnItemClickListener popmenuItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
    System.out.println("下拉菜单点击" + position);
    popMenu.dismiss();
    }
    };
    }

    下载地址

                 download.csdn.net/detail/liyaming1/6479971

    展开全文
  • 想做一个app屏蔽home下拉菜单,往上有这几种方法,第一, 重写onAttachedToWindow()方法,然后在HOME点击事件KeyEvent.KEYCODE_HOME。 第二, 抓取系统log日志,判断有没有打印“Android.intent.category.HOME...
  • 经常使用华为手机的朋友一定有用到过华为系统,长按右下角菜单键,如果内存可以清除,就会出现一个上拉清除内存的功能界面。之前博客里也提到了,f一直想做出这个效果,琢磨了一段时间,基本做出了雏形,不过做的...

    经常使用华为手机的朋友一定有用到过华为系统,长按右下角菜单键,如果内存可以清除,就会出现一个上拉清除内存的功能界面。之前博客里也提到了,f一直想做出这个效果,琢磨了一段时间,基本做出了雏形,不过做的只是下拉,圆弧从没有到完整闭合的效果,没有融入属性动画(华为系统默认效果有个类似皮球落地反复弹跳的动画),f本身对于动画不感冒,所以没有写进去,如果有人感兴趣,可以在我的基础上添加,同时f也没把具体清除的内存写进去,因为是调用系统的一些简单功能,大家有兴趣可以自己查一下。f旨在学习一下自定义view,viewgroup。这里先膜拜鸿洋大神,他的自定义view我已经连续学习了好多天了,还会一直坚持下去。下面正文开始。


    1.简单分析一下,手指必须是触碰最下边的布局,才能实现清除功能,所以我们打算给整个view或者是viewgroup设置onTouchListener,往上拉的时候,圆弧开始出现,当向上滑动的距离,等于圆的直径时,圆弧出现一半,等于两倍直径时,圆弧闭合成为一个完整的圆。超过两倍直径再上拉不会动,松手就清除了内存,如果未超过两倍直径,布局会回去,同时圆弧也消失。
    2.第一步,我们先画圆弧。

    public class MyViewOne extends View{
    
        private int mLastY;
        private int mScreenHeight,mScreenWidth;
        private RectF rectF;
        public static final int mRadius = 50;
        private Paint paint;
        private int startHeight = 50;
        public float sweepAngle = 0;
        private boolean clear;
        private int mStrokenWidth = 2;
        private int viewHeight;
    
    
        public MyViewOne(Context context, AttributeSet attrs,float sweepAngle) {
            super(context, attrs);
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            mScreenHeight = outMetrics.heightPixels;
            mScreenWidth = outMetrics.widthPixels;
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(mStrokenWidth);//设置画笔末端的宽度
            paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔末端是圆角
            this.sweepAngle = sweepAngle;//圆弧的闭合角度
            Log.i("abc", "sweepAngle:"+sweepAngle);
    
    
        }
    
        public MyViewOne(Context context) {
            this(context, null,0f);
    
        }
    
        public MyViewOne(Context context,float sweepAngle){
            this(context,null,sweepAngle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
        }
    
    
        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            super.onLayout(changed, left,  top,  right,  bottom);
        }
    
    @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            rectF = new RectF(mScreenWidth/2 - mRadius,startHeight,mScreenWidth/2+mRadius,2*mRadius+startHeight);
            canvas.drawArc(rectF, -90, sweepAngle, false, paint);
    
        }

    这里需要一些自定义view的基础,以及如何画圆弧。需要提醒一下,drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)画圆弧时候,startAngle是圆弧开始的角度,以三点钟为0,六点钟是90,九点钟是180,12点钟是-90,顺时针画弧,sweepAngle是圆弧的角度,也就是开始于结束的角度差,注意是差值,超过360就是圆。


    3.分析华为的系统功能,有两段文本提示内存的相关消息,所以我画了一个布局,准备在自定义viewgroup时候,add上去。

    public class MyViewGroup extends LinearLayout{
    
        MyViewOne view;
        private Context context;
        private TextView tvMemory,tvPullToClear;
        private UpdateMemoryListener updateMemoryListener;
    
        public MyViewGroup(Context context) {
            this(context, null);
        }
    
        public MyViewGroup(final Context context, AttributeSet attrs) {
            super(context, attrs);
            this.context = context;
            View child = LayoutInflater.from(context).inflate(R.layout.progress , null);
            viewHeight = child.getMeasuredHeight();
            tvMemory = (TextView) child.findViewById(R.id.tv_memory);
            tvPullToClear = (TextView) child.findViewById(R.id.tv_pull_to_clear);
            addView(child);
        }
    
    public void update(float sweepAngle , int dy ){
            if(null != getChildAt(1)){
                removeViewAt(1);
            }//每次加之前,需要把上一个删掉。由于整体是动态add上去的,第一个add的child,下标为0,后面add的MyViewOne下标为1
            //if(updateMemoryListener != null){}需要重写的方法
            view = new MyViewOne(context,null,sweepAngle);
            LinearLayout.LayoutParams lp = new    LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
            lp.topMargin = 30;
            view.setLayoutParams(lp);
            addView(view);
            scrollTo(0, -dy);//后面做解析
    }
    
    public interface UpdateMemoryListener{
            public String updateAvailableMemory();
    
            public String getTotalMemory();
        }
    
        public void setUpdateMemoryListener(UpdateMemoryListener updateMemoryListener){
            this.updateMemoryListener = updateMemoryListener;
        }

    UpdateMemoryListener这个接口主要是提供内存信息的接口,可以在activity里,给MyViewGroup设置UpdateMemoryListener监听,重写方法,同时要修改一下update方法。我没有用,所以注掉了。
    继承自线性布局,所以需要我们指定布局的排列方法。如果是垂直排列,那么布局就是往下面加,所以后面addview就是加到下面的。
    下面贴progress的布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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_marginTop="10dip"
            android:id="@+id/tv_memory"
            android:gravity="center_horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <TextView
            android:layout_below="@+id/tv_memory"
            android:id="@+id/tv_pull_to_clear"
            android:layout_marginTop="10dip"
            android:gravity="center_horizontal"
            android:text="向下滑动,清除全部应用"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    
    </RelativeLayout>

    4.然后怎么用呢?就是写到布局文件,加载到activity中。下面是布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#e0000000"
        android:id="@+id/rl"
        >
    
        <com.fjf.pulltoclear.MyViewGroup
            android:orientation="vertical"
            android:id="@+id/my_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></com.fjf.pulltoclear.MyViewGroup>
    
    </RelativeLayout>

    下面是activity

    public class MainActivity extends Activity {
    
        private MyViewGroup view;
        private int mLastY;
        private RelativeLayout rl;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_pulltoclear);
            initViews();
        }
    
        private void initViews(){
            rl = (RelativeLayout) findViewById(R.id.rl);
            rl.getBackground().setAlpha(100);
            view = (MyViewGroup) findViewById(R.id.my_view);
            view.setUpdateMemoryListener(new UpdateMemoryListener() {
    
                @Override
                public String updateAvailableMemory() {
                    // TODO Auto-generated method stub
                    return null;
                }
    
                @Override
                public String getTotalMemory() {
                    // TODO Auto-generated method stub
                    return null;
                }
            });
    
            view.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    int y = (int) event.getY();
                    switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        mLastY = y;
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        int dy = y - mLastY;//获得move的距离
                        Log.i("abc", "dy:" + dy);
                        //向下拉
                        if (dy > 0) {
                        //如果下拉的距离未超过两倍直径,即四倍半径
                            if (dy < 4 * MyViewOne.mRadius) {
                                view.update(1.8f * dy, dy);
                            } else {
                        //超过了,就显示一个完整的圆     
                        view.update(360f, 4 * MyViewOne.mRadius);
                            }
    //如果往上拉,则不动
                        } else if (dy <= 0) {
                            view.update(0f, 0);
                        }
                        return true;
                    case MotionEvent.ACTION_UP:
                    //同样判断是下拉
                        if (y - mLastY > 0) {
                        //如果未超过四倍半径,不清理内存,同时布局回到原位,圆弧要消失
                            if (y - mLastY < 4 * MyViewOne.mRadius) {
                                Log.i("abc", "不清除内存");
                                view.update(0f, 0);
                                //否则清除内存,关闭当前界面
                            } else {
                                Log.i("abc", "清除内存");
    
                                Toast.makeText(MainActivity.this, "内存已经释放", Toast.LENGTH_SHORT).show();
                                finish();
                            }
                        }
                        return true;
                    }
                    return false;
                }
            });
        }
    }   

    注意如果要提醒内存,注意UpdateMemoryListener的实现
    touch事件的注解也比较详细,现在解析一下MyViewGroup的update()方法,重点说明滑动和闭合圆弧的角度。

    华为系统的实现,滑动距离为直径时候,显示一半圆,滑动距离为两倍直径,显示完整的圆。两种情况,直径与圆弧的比例分别为R:180,2R:360,所以距离:弧度=R:180,我们定了圆的半径为50,所以弧度=180*距离/R,也就是弧度=1.8×距离。至于scroll,更简单了,只调用最基本的api即可,因为是向下滑动,所以scroll传入的值为负即向下滑动,而x轴保持不变,所以调用scrollTo( 0 , -距离);即可,注意,我们向下滑才出发update方法,下滑的距离为正。

    基本的解析就是这些,接下来要分享一下f完成这个功能时候遇到的一个问题。

    5.问题总结
    f最开始,把事件分发写到了MyViewOne中,而progress布局中的textview是写到mainactivity的布局中,这样的结果是整个界面在滑动的过程中一直抖动,一直抖,当初是用postInvalidate()方法实现重绘的,f分析认为,可能是由于这些子控件不是一个view或者viewgroup,如果把他们封装到一起,可能就不会抖动。当然现在这种方法和每次根据传入的角度new一个view添加上,我认为这种处理,对于一直抖动的情况可能有效。

    而且比较2的是,继承自线性布局,我却没有指定方法,圆弧一直出不来,快郁闷死了,后来去看线性布局的源码才意识到没有指定方向啊。。。

    f研究这个控件有一段时间,最开始脑袋有点乱,等f把单独的功能分开以后,有种豁然开朗的感觉,也算是经验吧,对于复杂的内容,分割开,一块块解决,可能更顺利一些。

    f也深入学习了鸿洋的自定义view,深入去理解scroller的一些用法,收获真的很多,搞技术还是需要多看多了解啊,见多识广,遇到问题才能分析解决。

    博客到这里也算告一段落了吧,有问题可以留言,希望能和大家多多交流~

    展开全文
  • 查了一下,要实现屏蔽home下拉菜单功能和手机cpu(有帖子说MTK的cpu可以实现这功能)以及android版本有关。试验了几部后,发现只有一部斐讯(高通cpu,android4.0+)和华为g系列某款(高通cpu,android4.0+)...
  • 本文实例讲述了Android编程实现仿QQ发表说说,上传照片及弹出框效果。分享给大家供大家参考,具体如下: 代码很简单,主要就是几个动画而已,图标什么的就随便找了几个,效果图:   动画说明: 1.点击右上角按钮,菜单从...
  • android学习日记:关于ActionBar和Menu

    千次阅读 2013-01-09 11:04:04
    最近看到一篇新闻,google工程师督促android开发者不要依赖物理Menu,而是要多用下拉菜单,以后的android会放弃三个物理按键的设定,只保留一个。然后就试着学习了下在ActionBar中的按钮以及下拉菜单是如何实现的...

    最近看到一篇新闻,google工程师督促android开发者不要依赖物理Menu键,而是要多用下拉菜单,以后的android会放弃三个物理按键的设定,只保留一个。然后就试着学习了下在ActionBar中的按钮以及下拉菜单是如何实现的。但是只能找到一部分的例子,不过还是有所收获,以下是效果图:


    关于ADD按钮其实就是物理Menu键的一种,只不过在定义该按钮时加上一行android:showAsAction="ifRoom",就可以让它在ActionBar上显示,而不是出现在下面。代码如下

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/menu_settings"
            android:title="@string/menu_settings"
            android:orderInCategory="100"
            android:showAsAction="never" />
        <item 
            android:id="@+id/add"
            android:title="@string/add"
            android:showAsAction="ifRoom"
            />
    </menu>
    

    除了ADD还可以随意添加多个按钮到ActionBar上,不过空间有限,当超出了ActionBar的范围时就不会在上面显示该按钮,而会转到物理Menu弹出的那个地方去显示。当然,该过程也可以在代码中的onCreateOptionsMenu方法中来进行,代码如下:

    @Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// TODO Auto-generated method stub
    		super.onCreateOptionsMenu(menu);
    		MenuItem add = menu.add(0, 1, 0, "add");
    		MenuItem open = menu.add(0, 2, 1, "open");
    		MenuItem close = menu.add(0, 3, 2, "close");
    		add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    		open.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    		close.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    		//MenuInflater inflater = getMenuInflater();
    		//inflater.inflate(R.menu.activity_main, menu);
    		return true;
    	}

    而至于那个可以下拉的one按钮,暂时还没有找到可以让它布局到右上角的方法,它是一个类似于列表导航的功能,位置是直接定好的,不知道能不能修改。代码如下:

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //button = (Button)findViewById(R.id.btn);
            //button.setOnClickListener(this);
            setUpActionBar(false, 0);
        }
        
        private void setUpActionBar(boolean showTabs, int selTabs) {
    		// TODO Auto-generated method stub
        	android.app.ActionBar actionBar = getActionBar();
        	actionBar.setDisplayShowTitleEnabled(false);
        	//CompatActionBarNavHandler handler = new CompatActionBarNavHandler((CompatActionBarNavListener) this);
        	actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_LIST);
        	SpinnerAdapter adapter = new ArrayAdapter<String>(this, R.layout.actionbar_list_item, CHOOSE);
        	actionBar.setListNavigationCallbacks(adapter, null);
        	actionBar.setDisplayUseLogoEnabled(true);
    	}

    它是用android.app.ActionBar中的setNavigationMode和setListNavigationCallbacks方法来实现的。下拉菜单的样式可以在R.layout.actionbar_list_item中定义,内容可以用CHOOSE字串数组来填充。但是下拉菜单的启动按钮应该如何实现布局,我还没有找到方法。看了官方API的samples,虽然honeycombGallery中有一样的控件,但是它没有调整该控件的位置,如果有知道的大神,希望不吝赐教下!

    至于下拉菜单的按钮事件监听,是在onCategorySelected方法中实现的,代码如下:

    @Override
        public void onCategorySelected(int catIndex) {
        	log("onCategorySelected called");
            //setNewsCategory(catIndex);
            //do something here
     }

    参数catIndex是相应按钮的ItemID,用来确定是哪个按钮被点击了。
    展开全文
  • android开发秘籍

    2014-07-14 09:41:40
    4.4.4 秘诀38:创建下拉菜单 90 4.4.5 秘诀39:使用进度条 92 4.4.6 秘诀40:使用拖动条 94 第5 章 用户界面事件 97 5.1 事件处理器和事件监听器 97 5.1.1 秘诀41:截取物理按键事件 97 5.1.2 秘诀42:创建菜单 ...
  • android开发秘籍--pdf

    热门讨论 2013-06-18 21:56:07
    4.4.4 秘诀38:创建下拉菜单  4.4.5 秘诀39:使用进度条  4.4.6 秘诀40:使用拖动条  第5章 用户界面事件  5.1 事件处理器和事件监听器  5.1.1 秘诀41:截取物理按键事件  5.1.2 秘诀42:创建菜单  ...
  • 开发当中比如说让你写一个根据用户的输入,去搜索相关内容,你会怎么实现,写一...让你实现一个根据用户的输入弹出一个下拉菜单等等,其实都大可没有必要去自己写,本身Android里都有,下面对各个控件,我会一一举例。

    本篇文章重点讲解Android中那些你忽略的控件:

    1、SearchView

    2、Switch

    3、AutoCompleteTextView

    4、CalendarView

    5、DatePicker

    6、Chronomet

    7、ExpandableListView

    8、ViewSwitcher


    执笔不易,更多文章还请大家关注左侧我的公众账号。


    开发当中比如说让你写一个根据用户的输入,去搜索相关内容,你会怎么实现,写一个输入框,监听输入框的内容变化,调起软键盘的搜索或者确认键进行搜索?还有,让你实现一个开关的切换,你会怎么做,写一个layout,一半点击为开,一半点击为关,还是两张图片,点一下开,再点一下关?让你实现一个根据用户的输入弹出一个下拉菜单等等,其实都大可没有必要去自己写,本身Android里都有,下面对各个控件,我会一一举例。


    1、SearchView


    SearchView这个控件,主要用来处理用户的输入,并对用户的输入做出响应。


    先看下各个属性介绍:


    属性名称

    相关方法

    描述

    android:iconifiedByDefault

    setIconifiedByDefault(boolean)

    设置搜索图标是否显示在搜索框内




    android:imeOptions

    setImeOptions(int)

    设置输入法搜索选项字段,默认是搜索,可以是:下一页、发送、完成等




    android:inputType

    setInputType(int)

    设置输入类型




    android:maxWidth

    setMaxWidth(int)

    设置最大宽度




    android:queryHint

    setQueryHint(CharSequence)

    设置查询提示字符串


    XML里引用


    <SearchView
        
    android:id="@+id/seach"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:iconifiedByDefault="false"
        android:queryHint="请输入要搜寻的东西/>


    代码里通过以下方法可以监听用户的输入


    SearchView mSearchView = (SearchView) findViewById(R.id.seach);
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        //点击搜索
        
    @Override
        
    public boolean onQueryTextSubmit(String query) {
            Log.i("MainActivity"query);
            return false;
        
    }

        //搜索内容改变
        
    @Override
        
    public boolean onQueryTextChange(String newText) {
            Log.i("MainActivity"newText);
            return false;
        
    }
    });


    具体效果可见下图:




    2、Switch


    Switch控件主要作用是描述一个开关,可以滑动,也可以点击,省去了我们自定义的很多不必要的麻烦。


    XML里引用


    <Switch
        
    android:id="@+id/switchs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />


    代码里监听状态


    Switch mSwitch=(Switch)  findViewById(R.id.switchs);
    mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            //
            
    if(isChecked){

            }else{
                //
            
    }

        }
    });


    具体效果如下图:




    具体UI我们可以自己来调整,可通过下面两个属性,第一个设置是设置拖动按钮,第二个是设置背景。


    android:thumb="@drawable/switch_bg”
    android:track="@drawable/track_bg"

    设置自动选中状态可以通过android:checked="true”来设置。



    3、AutoCompleteTextView


    AutoCompleteTextView控件可以根据用户的输入,弹出一个下拉菜单


    AutoCompleteTextView常用属性

    android:completionHint

    设置出现在下拉菜单中的提示标题

    android:completionThreshold

    设置用户至少输入多少个字符才会显示提示

    android:dropDownHorizontalOffset

    下拉菜单于文本框之间的水平偏移。默认与文本框左对齐

    android:dropDownHeight

    下拉菜单的高度

    android:dropDownWidth

    下拉菜单的宽度

    android:singleLine

    单行显示

    android:dropDownVerticalOffset

    垂直偏移量


    XML里引用:


    <AutoCompleteTextView
        
    android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/autotext"
        />


    代码实现:


    AutoCompleteTextView autotext =(AutoCompleteTextView) findViewById(R.id.autotext);
    final 
    String [] arr={"1001","1002","1003","1004"};
    ArrayAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arr);
    //设置Adapter
    autotext.setAdapter(arrayAdapter);
    //监听item选择
    autotext.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        
    public void onItemClick(AdapterView<?> parentView view, int position, long id) {
            Toast.makeText(MainActivity.this,arr[position],Toast.LENGTH_LONG).show();
        
    }
    });


    具体效果见下图:




    4、CalendarView


    CalendarView这个控件是要是用于显示日历。


    其各个属性如下显示:


    android:dateTextAppearance  设置日历View在日历表格中的字体皮肤;

    android:firstDayOfWeek   指定日历第一个星期的第一天,在日历中横向所在位置,从右边向左数,从1开始计数;

    android:focusedMonthDateColor  设置日历表格当月显示的日期字体颜色;

    android:maxDate 设置日历能够显示的最大日期;

    android:minDate 设置日历能够显示的最小日期;

    android:selectedDateVerticalBar 设置当前选择日期选择边框左右两边显示的图标;

    android:selectedWeekBackgroundColor  设置当前选择日期所在行的背景颜色(除了选中的日期之外);

    android:showWeekNumber   设置是否显示周期数量;

    android:shownWeekCount 设置设备一屏显示多少周即多少行;

    android:unfocusedMonthDateColor  设置非当前选择月的字体颜色与focusedMonthDateColor相反;

    android:weekNumberColor  设置显示周期编号字体的颜色;

    android:weekSeparatorLineColor  设置日历每行之间分割线的颜色;


    XML里引用:


    <CalendarView
        
    android:id="@+id/calendar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


    代码实现选择日期:


    CalendarView mCalendarView=(CalendarView) findViewById(R.id.calendar);
    //获取日期点击事件
    mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
        @Override
        
    public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
            Toast.makeText(MainActivity.this,year+"==="+(month+1)+"==="+dayOfMonth,Toast.LENGTH_LONG).show();
        
    }
    });


    效果如下图:






    5、DatePicker


    DatePicker控件和CalendarView基本类似,都是用来显示日期,只不过了一个显示选择后的日期UI,


    • android:calendarViewShown:是否显示日历。

    • android:startYear:设置可选开始年份。

    • android:endYear:设置可选结束年份。

    • android:maxDate:设置可选最大日期,以mm/dd/yyyy格式设置。

    • android:minDate:设置可选最小日期,以mm/dd/yyyy格式设置。


    XML里引用


    <DatePicker
        
    android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


    代码实现:


    DatePicker mDatePicker=(DatePicker) findViewById(R.id.datePicker);
    //初始化日期
    mDatePicker.init(2017716, new DatePicker.OnDateChangedListener() {
        @Override
        
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            Toast.makeText(MainActivity.this, year+"==="+monthOfYear+"=="+dayOfMonthToast.LENGTH_SHORT).show();
        
    }
    });



    效果如下图:




    6、Chronomet:


    Chronomet控件用来展示一个倒计时。

    XML里引用,这里我添加了几个按钮,用来控制开始,暂停,和重置,format用于格式化时间。


    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff">

        <Chronometer
            
    android:id="@+id/chronometer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:format="计时:%s" />

        <LinearLayout
            
    android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/chronometer"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp">

            <Button
                
    android:id="@+id/start"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="开始/>

            <Button
                
    android:id="@+id/stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="暂停"
                />

            <Button
                
    android:id="@+id/reset"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="重置"

                />
        </LinearLayout>
    </RelativeLayout>


    在代码里实现定时任务:


    public class MainActivity extends AppCompatActivity {
        private Chronometer mChronometer;

        
    @Override
        
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_svg);
            
    mChronometer = (Chronometer) findViewById(R.id.chronometer);
            
    mChronometer.setFormat("计时:%s");
            
    findViewById(R.id.start).setOnClickListener(onClickLitener);
            
    findViewById(R.id.stop).setOnClickListener(onClickLitener);
            
    findViewById(R.id.reset).setOnClickListener(onClickLitener);
        
    }

        private View.OnClickListener onClickLitener new View.OnClickListener() {
            @Override
            
    public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.start://开始
                        
    mChronometer.start();
                        break;
                    case 
    R.id.stop://停止
                        
    mChronometer.stop();
                        break;
                    case 
    R.id.reset://重置
                        
    mChronometer.setBase(SystemClock.elapsedRealtime());
                        break;
                
    }
            }
        };

    }


    具体效果可见下图:




    7、ExpandableListView


    ExpandableListView控件主要用于实现一个可以下拉的下单,用起来也是很简单:

    XML里引用:



    <ExpandableListView
        
    android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    业务逻辑代码实现:


    public class MainActivity extends AppCompatActivity {
        private List<String> groupArray new ArrayList<>();
        private 
    List<List<String>> childArray new ArrayList<>();
        private 
    List<String> tempArray new ArrayList<String>();
        private 
    List<String> tempArray2 new ArrayList<String>();

        
    @Override
        
    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_svg);

            
    groupArray.add("百家姓");
            
    groupArray.add("国家行政区划");

            
    tempArray.add("");
            
    tempArray.add("");
            
    tempArray.add("");
            
    tempArray.add("张");

            
    tempArray2.add("商丘市");
            
    tempArray2.add("北京市");
            
    tempArray2.add("天津市");
            
    tempArray2.add("上海市");

            
    childArray.add(tempArray);
            
    childArray.add(tempArray2);
            
    ExpandableListView mExpandableListView = (ExpandableListView) findViewById(R.id.listview);
            
    mExpandableListView.setAdapter(new ExpandableAdapter());
            
    //获取item点击事件
            
    mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
                @Override
                
    public boolean onChildClick(ExpandableListView parentView v, int groupPosition, int childPosition, long id) {
                    Toast.makeText(MainActivity.this, childArray.get(groupPosition).get(childPosition)Toast.LENGTH_SHORT).show();
                    return false;
                
    }
            });
        
    }

        //ExpandableListViewAdapter
        
    public class ExpandableAdapter extends BaseExpandableListAdapter {

            public Object getChild(int groupPosition, int childPosition) {
                return childArray.get(groupPosition).get(childPosition);
            
    }

            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            
    }

            public int getChildrenCount(int groupPosition) {
                return childArray.get(groupPosition).size();
            
    }

            public View getChildView(int groupPosition, int childPosition,
                                     boolean 
    isLastChildView convertViewViewGroup parent) {
                String string = childArray.get(groupPosition).get(childPosition);
                return 
    getGenericView(string);
            
    }

            // group method stub
            
    public Object getGroup(int groupPosition) {
                return groupArray.get(groupPosition);
            
    }

            public int getGroupCount() {
                return groupArray.size();
            
    }

            public long getGroupId(int groupPosition) {
                return groupPosition;
            
    }

            public View getGroupView(int groupPosition, boolean isExpanded,
                                     
    View convertViewViewGroup parent) {
                String string = groupArray.get(groupPosition);
                return 
    getGenericView(string);
            
    }

            public TextView getGenericView(String string) {
                AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.FILL_PARENT64);
                
    TextView text = new TextView(MainActivity.this);
                
    text.setLayoutParams(layoutParams);
                
    text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                
    text.setPadding(100000);
                
    text.setTextColor(Color.parseColor("#000000"));
                
    text.setText(string);
                return 
    text;
            
    }

            public boolean hasStableIds() {
                return false;
            
    }

            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            
    }
        }

    }


    具体效果如下:





    8、ViewSwitcher


    ViewSwitcher控件是一个可以实现layout上下或者左右翻滚的效果,也就是所谓的翻页效果。

    XML里引用:


    <ViewSwitcher
        
    android:id="@+id/viewSwitch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />


    代码实现:


    public class MainActivity extends AppCompatActivity {
        private ScheduledExecutorService scheduledExecutorService;
        private 
    ViewSwitcher mViewSwitcher;

        
    @Override
        
    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_svg);
            
    mViewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitch);
            
    mViewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
                @Override
                
    public View makeView() {

                    return View.inflate(MainActivity.this, R.layout.activity_text, null);
                
    }
            });

            
    //设置切入动画
            
    TranslateAnimation animationTop = new TranslateAnimation(00-150);
            
    animationTop.setFillAfter(true);
            
    animationTop.setDuration(200);
            
    mViewSwitcher.setInAnimation(animationTop);
            
    //设置切出动画
            
    TranslateAnimation animationBottom = new TranslateAnimation(00060);
            
    animationBottom.setFillAfter(true);
            
    animationBottom.setDuration(200);
            
    mViewSwitcher.setOutAnimation(animationBottom);
        
    }

        @Override
        
    protected void onStart() {
            super.onStart();
            
    scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
            
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                
    public void run() {
                    handler.obtainMessage().sendToTarget();
                
    }
            }15TimeUnit.SECONDS);
        
    }

        private String[] tags = {
                "我是第一段文字",
                
    "我是第二段文字",
                
    "我是第三段文字",
                
    "我是第四段文字"
        
    };
        private int 
    indexSel;
        private 
    android.os.Handler handler new android.os.Handler() {
            @Override
            
    public void handleMessage(Message msg) {
                super.handleMessage(msg);
                
    mViewSwitcher.getNextView().findViewById(R.id.text).setVisibility(View.VISIBLE);
                
    String tag = tags[indexSel tags.length];
                
    ((TextView) mViewSwitcher.getNextView().findViewById(R.id.text)).setText(tag);
                
    mViewSwitcher.showNext();
                
    indexSel++;
            
    }
        };


    具体效果如图(图片静态,实际可以翻滚):



    展开全文
  • 采用7zip极限压缩,《Google Android 2.X应用开发实战》以Android操作系统架构为经,开发Android应用程序为纬,循序渐进地介绍Android应用程序开发实战技术,使开发人员不仅学习到Android操作系统的架构和基本原理,...
  • Android客制化——6.0底部导航栏增加隐藏按钮关于导航栏这一块按钮的增加其实网上也有很多的例子了,最多的可能就是一个关于音量加减的...我们知道关于通知栏、导航栏、下拉菜单实质上是一个SystemUI.apk。这部分的源
  • 5.8.7 Spinner(下拉列表控件) 157 5.9 滚动控件 160 5.9.1 ScrollView(垂直滚动控件) 160 5.9.2 HorizontalScrollView(水平滚动控件) 161 5.9.3 可垂直和水平滚动的视图 162 5.9.4 Gallery(画廊控件) ...
  • Android开发实战经典(PDF) 图书目录: 第1部分 走进Android的世界 第1章 认识Android 2 1.1 智能手机的发展 2 1.2 手机操作系统 3 1.3 走进Android 5 1.4 Android的体系结构 8 1.5 Android应用程序框架 10 ...
  • 第1部分 走进Android的世界 第1章 认识Android 2 1.1 智能手机的发展 2 1.2 手机操作系统 3 1.3 走进Android 5 1.4 Android的体系结构 8 1.5 Android应用程序框架 10 1.6 本章小结 11 第2章 搭建Android...
  • 4.8 自定义下拉菜单模式 99 4.9 动态添加/删除的spinner菜单 102 4.10 心爱小宝贝相片集 104 4.11 快速地搜索手机文件引擎 107 4.12 按钮也能随单击变换 109 4.13 具自动提示功能的菜单 110 4.14...
  • 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式...
  • 5.8.7 Spinner(下拉列表控件) 157 5.9 滚动控件 160 5.9.1 ScrollView(垂直滚动控件) 160 5.9.2 HorizontalScrollView(水平滚动控件) 161 5.9.3 可垂直和水平滚动的视图 162 5.9.4 Gallery(画廊控件) ...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...
  • 4.8自定义下拉菜单模式——spinner与setdropdownviewresource 4.9动态添加/删除的spinner菜单——arraylist与widget的依赖性 4.10心爱小宝贝相片集——gallery与衍生baseadapter容器 4.11快速的搜索手机文件引擎...
  •  4.8 自定义下拉菜单模式  4.9 动态添加/删除的Spinner菜单  4.10 心爱小宝贝相片集  4.11 快速地搜索手机文件引擎  4.12 按钮也能随单击变换  4.13 具自动提示功能的菜单  4.14 数字及模拟小时钟设计 ...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...
  •  4.8 自定义下拉菜单模式   4.9 动态添加/删除的Spinner菜单   4.10 心爱小宝贝相片集   4.11 快速地搜索手机文件引擎   4.12 按钮也能随单击变换   4.13 具自动提示功能的菜单   4.14 ...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...
  • 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与...
  • 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与...
  • 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与...
  • 4.8 自定义下拉菜单模式 4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与...
  • 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

android下拉菜单键实现