Android学习笔记之树形菜单的应用...

PS:终于考完试了,总算是解脱了...可以正式上手项目开发了....

学习内容:

1.掌握如何使用树形菜单...

  对知识点进行一下补充...居然忘记了去学习树形菜单...不过在这里补上...

ExpandableListView树形菜单...

  树形菜单其实就是一个列表,只不过是在列表中再次嵌套一个或者是多个子菜单项,子菜单项中可以包括很多的内容...其实就拿QQ来说,就是使用了一个树形菜单...QQ中的分组管理其实就是树形菜单的一个应用...树形菜单继承与ListView...这里我们使用的是ExpandableListView...一般只要是涉及到了ListView类的列表控件,那么不用多想,肯定会使用到适配器...适配器的目的我想大家都知道,其实就是设置这些列表项以怎样的方式在画布上进行显示...这里我们使用一个BaseExpandableListAdapter适配器...我们只需要在适配器中定义显示的模式就可以了...

  用一个简单的小例子来实现一下...这里就简单的使用一个二级的树形菜单...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="树形菜单..."
        android:textSize="18dp"
        android:gravity="center"/>
    <ExpandableListView
        android:id="@+id/expandablelistview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#ffffff">
    </ExpandableListView>

</LinearLayout>

  上面就是一个简单的布局文件...只有一个ExpandableListView控件在画布上进行显示...有的时候我们可以看到非常好看的属性菜单,那么我们其实可以通过属性值background属性来设置,可以把其背景色改成其他的颜色或者是其他的图片背景...这里实现过程还是比较重要的...使用ExpandableListView需要重写其内部的方法...必须要进行覆盖的两个方法...

  getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent);

  getChildView(int groupPosition, int chlidPosition, boolean isLastChild, View convertView, ViewGroup parent);

  这是两个必须要继承的方法...其实看起来并不是很麻烦。这个方法的目的就是,先把这个菜单当成了一个视图...groupPosition这个参数就是来表明树形菜单从属的位置,isExpanded这个参数来判断某一个树形菜单是展开的还是封闭的...说白了就是点击开了,还是给点击关了,convertView是一个视图对象,因为这个方法View形的,那么必然需要传递View对象才能够完成该方法的调用...parent参数就是判断这个树形菜单的每一个选项是否有自己的父菜单...另一个方法的参数基本类似,其实就是对每一子菜单项的一些操作...

package com.example.expandablelistview;

import android.os.Bundle;
import android.app.Activity;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置一个ExpandableListView设置一个适配器...然后在总画布上进行显示...
        final ExpandableListAdapter adapter=new ExpandableListAdapter() {
            private String[] MainView=new String[]{"一班","二班","三班"};//一级列表所要显示的内容...
            //列表组件需要使用到适配器...这个适配器的使用,目的是列表下的子选项以什么样的格式进行展示...
            private String[][] SubView=new String[][]{{"aa","bb","cc","dd","ee"},{"aaa","bbb","ccc","ddd","eee"},{"a","b","c","d","e"}};//树形菜单子列表的内容...
            TextView getTextView(){

                @SuppressWarnings("deprecation")
                AbsListView.LayoutParams lp=new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,64);//定义了一个布局,设置其长度和宽度...
                TextView textview=new TextView(MainActivity.this);
                textview.setLayoutParams(lp);//目的是把自身放在lp这个布局中进行显示...
                textview.setGravity(Gravity.CENTER_VERTICAL);//设置居中显示...
                textview.setPadding(36, 0, 0, 0);//设置相对位置...
                textview.setTextSize(16);//设置字体的大小...
                textview.setTextColor(Color.BLACK);//设置字体的颜色...
                return textview;
            }
            @Override
            public void unregisterDataSetObserver(DataSetObserver observer) {
                // TODO Auto-generated method stub

            }

            @Override
            public void registerDataSetObserver(DataSetObserver observer) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGroupExpanded(int groupPosition) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGroupCollapsed(int groupPosition) {
                // TODO Auto-generated method stub

            }

            @Override
            public boolean isEmpty() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public boolean hasStableIds() {
                // TODO Auto-generated method stub
                return true;
            }

            //必须需要重写的方法...获取组视图...其实就是主视图...为主视图设置一个显示的方式...

            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                LinearLayout ll=new LinearLayout(MainActivity.this);
                ll.setOrientation(0);
                TextView textview=getTextView();
                textview.setTextColor(Color.BLACK);
                textview.setText(getGroup(groupPosition).toString());//设置主视图的数据信息...
                ll.addView(textview);
                return ll;
            }

            @Override
            public long getGroupId(int groupPosition) {
                // TODO Auto-generated method stub
                //获取被触发列表项的定位...
                return groupPosition;
            }

            @Override
            public int getGroupCount() {
                // TODO Auto-generated method stub
                //返回父菜单项的字符数组长度...
                return MainView.length;
            }

            @Override
            public Object getGroup(int groupPosition) {
                // TODO Auto-generated method stub
                //返回一个字符串对象...这个字符串我们自己可以定义其值...
                return MainView[groupPosition];
            }

            @Override
            public long getCombinedGroupId(long groupId) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public long getCombinedChildId(long groupId, long childId) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                // TODO Auto-generated method stub
                //返回子菜单项的数组长度...
                return SubView[groupPosition].length;
            }
            //设置子视图的布局...显示的信息,以及如何显示...
            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                LinearLayout ll=new LinearLayout(MainActivity.this);//设置一个布局...
                ll.setOrientation(0);
                TextView textview=new TextView(MainActivity.this);
                textview.setText(getChild(groupPosition, childPosition).toString());//textView所要显示的内容...
                ll.addView(textview);//将这个布局中添加textView控件...
                return ll;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return childPosition;
            }

            @Override
            public Object getChild(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                //这里返回父菜单下的子菜单项的字符数组对象...
                return SubView[groupPosition][childPosition];
            }

            @Override
            public boolean areAllItemsEnabled() {
                // TODO Auto-generated method stub
                return false;
            }
        };
        ExpandableListView expandableListView=(ExpandableListView) findViewById(R.id.expandablelistview);//获取组件...
        expandableListView.setAdapter(adapter);//绑定适配器...
        expandableListView.setOnChildClickListener(new OnChildClickListener() {
            //这里设置了一个监听,就是当每一个子菜单被点击的时候,我们也可以触发一些操作...
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "您刚才点击了"+adapter.getChild(groupPosition, childPosition), Toast.LENGTH_LONG).show();
                return false;
            }
        });   

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

  这就是一个简单的实现过程...树形菜单的应用是非常广泛的,我们设置是可以在子菜单项被点击之后再次设置一个布局来显示更多的数据信息...但是在使用树形菜单的时候我们需要注意就是一定要让所有的菜单项目能够充分的展开显示在画布之上....这一点我们需要注意...

时间: 2024-10-19 17:06:40

Android学习笔记之树形菜单的应用...的相关文章

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供.我们将相关信息存储在一个intent中,例如该文本的Uri.这个intent可以匹配系统的多个应用,替代菜单将这些应用一一列出,菜单项的title就是该可被调用的activity的名字,图标也为该可被调用的activity的图表. 小例子说明 我们通过一个小例子进行学习,简单地打开一个URL:we

Pro Android学习笔记(十):了解Intent(上)

Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBaiscViewActivity.在AndroidManife

Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)

前几日Android发布了4.0 Icecream,昨天上网发现Begining Book中有Edition 3的版本,比对一下,还是有相当的改动,不仅仅增加了tablet的部分,对原有的章节有有一些修订,前后的调整等等.先按Edtion 2的顺序看,相同章节的看Edtion 3,然后回头看Edition 3的Chapter 24.25(E2的36).26.27.28.29.44.45.46.47几个新增章节.同时将模拟器改为Android 2.3的版本,已适应可能新增的改动. 访问Intern

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android 学习笔记(二七):Menu

Menu由两种形式,Option menu和Context menu.前者是按下设备的Menu硬按钮弹出,后者是长按widget弹出. Option Menu 当我们按下Menu的硬件按钮时,Option Menu将被触发显示,最多可以显示6个选项的icon菜单,如果选项多于6个,第6个选项显示为“More“,点击可以进入扩展菜单.我们将在Android学习笔记(十一):Activity-ListView的例子一的基础上来学习Option Menu,也就是一个基于activity的菜单. 在这个

Pro Android学习笔记 ActionBar(1):Home图标区

 Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ? 综合 ? 共 3256字 ? 字号 小 中 大 ? 评论关闭 ActionBar在Android 3.0 SDK中为平板引入,在4.0中也可以在phone中使用.在title中提供类似tab和菜单的效果,有三种形式:Tabbed action bar,list action bar和standard action bar,我们将在小例子中进行示范. Home Icon 在Actio

Android学习笔记-EditText&TextView&Button&菜单栏

界面文件activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="ma

【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和theme有关,如果theme设置不正确,还可能会出现异常. 相关的代码如下: public class ListActionBarDemo extends SearchTestCase3 implements OnNavigationListener{ //List触发的回调函数接口    @Ov

【转】Pro Android学习笔记(十):了解Intent(上)

目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBa