因为需要,最近几天忙着写来电管家这个小软件,现在已经基本写的差不多了,基本的功能也都已实现,就剩下后续的完善了,而之前的记事本项目最近几天没写,但是肯定还是会完成的。

           来电管家的基本功能,这里主要做的是拦截。

                   1.    添加黑白名单

                   2.    选择拦截模式

                   3.    启用拦截时间段

                   4.    拦截开关

          主要功能,就是通过用户选择开启拦截,并选择拦截模式,这时就会启动后台监听服务,监听来电,判断是否挂断,并且,用户可以自由选择拦截时间段,也就是在该时间段内才启用监听服务。

         先来看界面:

         

android 来电界面修改 安卓来电界面_ActivityGroup

android 来电界面修改 安卓来电界面_xml_02

  

android 来电界面修改 安卓来电界面_ActivityGroup_03

          从界面其实也可以看出,这里主要应用了ActivityGroup和Activity的组合使用,以达到分页标签的作用,类似很多软件,如QQ。

          直接上代码:

          main.xml        这个就是ActivityGroup的布局文件,图中的四个页面就是四个Activity,就位于主布局文件中的LinearLayout容器中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
	<RelativeLayout 
	    android:layout_height="fill_parent"
		android:layout_width="fill_parent">
		<GridView 
		    android:layout_height="35dp" 
		    android:id="@+id/gvTopBar"
			android:layout_alignParentTop="true" 
			android:layout_width="fill_parent"
			android:background="@drawable/tabbar_bg"
			android:layout_centerVertical="true"
			>
		</GridView>
		 <ImageView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/gvTopBar"
            android:src="@drawable/line"
            />
		<LinearLayout 
			android:id="@+id/Container"
			android:layout_below="@+id/gvTopBar" 
			android:layout_width="fill_parent"
			android:layout_height="fill_parent"
			android:orientation="vertical">
		</LinearLayout>
		
	</RelativeLayout>
</LinearLayout>

        其中GridView用于放置顶部的分布菜单,ImageView就是图中的虚线,而最下面的LinearLayout则是放置四个页面的容器。

        下面给出四个页面的布局文件

        黑白名单页面布局文件  activity_add.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/layout"
    >
   
        <ListView 
        
        android:id="@+id/lv_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:cacheColorHint="#FFF" >

        </ListView>
        
    
    
     <RelativeLayout 
        
        android:id="@+id/add_layout"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:visibility="visible"
        android:background="@drawable/tabbar_bg"
        >
       <ImageView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/line"
            />
       <Button
        android:id="@+id/btn_add"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_centerHorizontal="true"
        android:background="@drawable/add"
        />
         
         
        </RelativeLayout>
    <RelativeLayout 
        
        android:id="@+id/delete_layout"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:visibility="gone"
        android:background="@drawable/tabbar_bg"
        >
       <ImageView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/line"
            />
        <Button 
            android:id="@+id/btn_cancel"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:background="@drawable/backup"
            />
       
        <TextView 
            android:id="@+id/tv_select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="共选择了项"
            android:layout_centerInParent="true"
            />
        <Button 
            android:id="@+id/btn_delete"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:background="@drawable/delete"
            android:layout_alignParentRight="true"
            />
      </RelativeLayout>
</LinearLayout>

            

            拦截记录的布局文件activity_callInfo.xml

<?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" >
    
  <ListView 
        
        android:id="@+id/lv_show_callInfo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
         >

        </ListView>
        
  <RelativeLayout 
        
        android:id="@+id/add_layout"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:visibility="visible"
        android:background="@drawable/tabbar_bg"
        >
       <ImageView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/line"
            />
       <Button
        android:id="@+id/btn_delete_callInfo"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_centerHorizontal="true"
        android:background="@drawable/delete"
        />
         
    </RelativeLayout>
  
</RelativeLayout>

 

        设置页面的布局文件activity_setting.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    >
	<RelativeLayout 
	    android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:gravity="center"
	    android:padding="8dp"
	    android:layout_marginLeft="20dp"
	    android:layout_marginRight="20dp"
	    android:layout_marginTop="30dp"
	    android:background="@drawable/setting_top"
	    >
	    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开启监听" 
        android:textSize="15sp"
        />
		<ToggleButton 
		android:id="@+id/tb_switch"
	    android:layout_width="44dp"
        android:layout_height="20dp"
        android:background="@drawable/start_service_off"
        android:textOff=""
        android:textOn=""
        android:layout_alignParentRight="true"
	    />
	</RelativeLayout>
	
	<RelativeLayout 
	    android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:gravity="center"
	    android:padding="8dp"
	    android:layout_marginLeft="20dp"
	    android:layout_marginRight="20dp"
	    android:background="@drawable/setting_middle"
	    >
	    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="白名单模式" 
        android:textSize="15sp"
        />
		<ToggleButton 
		android:id="@+id/tb_whitelist"
	    android:layout_width="44dp"
        android:layout_height="20dp"
        android:background="@drawable/start_service_off"
        android:textOff=""
        android:textOn=""
        android:layout_alignParentRight="true"
	    />
	</RelativeLayout>
	
	<RelativeLayout 
	    android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:gravity="center"
	    android:padding="8dp"
	    android:layout_marginLeft="20dp"
	    android:layout_marginRight="20dp"
	    android:background="@drawable/setting_middle"
	    >
	    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启用时间段" 
        android:textSize="15sp"
        />
		<ToggleButton 
		android:id="@+id/tb_time"
	    android:layout_width="44dp"
        android:layout_height="20dp"
        android:background="@drawable/start_service_off"
        android:textOff=""
        android:textOn=""
        android:layout_alignParentRight="true"
	    />
	</RelativeLayout>
	<RelativeLayout 
	    android:id="@+id/start_layout"
	    android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:gravity="center"
	    android:padding="8dp"
	    android:layout_marginLeft="20dp"
	    android:layout_marginRight="20dp"
	    android:background="@drawable/setting_middle"
	    >
	<TextView
	    android:id="@+id/tv_start_tip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始时间 " 
        android:textSize="15sp"
        android:textColor="@android:color/darker_gray"
        />
	<TextView
	    android:id="@+id/tv_start_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2014-9-11   >"
        android:textSize="15sp"
        android:layout_alignParentRight="true"
        android:textColor="@android:color/darker_gray"
        />
	</RelativeLayout>
	<RelativeLayout 
	    android:id="@+id/end_layout"
	    android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:gravity="center"
	    android:padding="8dp"
	    android:layout_marginLeft="20dp"
	    android:layout_marginRight="20dp"
	    android:background="@drawable/setting_under"
	    >
	<TextView
	    android:id="@+id/tv_end_tip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="结束时间 " 
        android:textSize="15sp"
        android:textColor="@android:color/darker_gray"
        />
	<TextView
	    android:id="@+id/tv_end_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2014-9-11   >"
        android:textSize="15sp"
        android:layout_alignParentRight="true"
        android:textColor="@android:color/darker_gray"
        />
	</RelativeLayout>
	
	
    
</LinearLayout>

            图中设置页面中的四周包围的线,其实是用到了.9.png图片。
        
            布局文件就上面这几个,那么顶部的分页菜单,及如何将四个Activity添加进ActivityGroup中。

             1)顶部菜单的实现:

               既然是GridView,当然要用适配器了,这里用的是自定义BaseAdapter,如下:

package com.example.callmanager;


import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;


public class TabBarAdapter extends BaseAdapter {
	private Context mContext; 
	private TextView[] txtItems;
	private int selResId;
    public TabBarAdapter(Context c,int[] tabMenuId,int width,int height,int selResId) { 
        mContext = c; 
        this.selResId=selResId;
        txtItems=new TextView[tabMenuId.length];
        for(int i=0;i<tabMenuId.length;i++)
        {
        	
        	txtItems[i] = new TextView(mContext); 
        	txtItems[i].setLayoutParams(new GridView.LayoutParams(width, GridView.LayoutParams.WRAP_CONTENT));//设置ImageView宽高 
        	txtItems[i].setGravity(Gravity.CENTER);
        	txtItems[i].setPadding(2, 5, 2, 5); 
        	txtItems[i].setText(tabMenuId[i]);
        	txtItems[i].setTextSize(15);
        	
        }
    } 
 
    public int getCount() { 
        return txtItems.length; 
    } 
 
    public Object getItem(int position) { 
        return position; 
    } 
 
    public long getItemId(int position) { 
        return position; 
    } 
 
    /** 
     * 设置选中的效果 
     */  
    public void SetFocus(int index)  
    {  
        for(int i=0;i<txtItems.length;i++)  
        {  
            if(i!=index)  
            {  
            	txtItems[i].setBackgroundResource(0);//恢复未选中的样式
            	
            }  
        }  
        txtItems[index].setBackgroundResource(selResId);//设置选中的样式
        
    }  
    
    public View getView(int position, View convertView, ViewGroup parent) { 
        TextView textView; 
        if (convertView == null) { 
        	textView = txtItems[position];
        	
        } else { 
        	textView = (TextView) convertView; 
        } 
        return textView; 
    } 
}

           接下来就是将自定义的Adapter与GridView进行绑定了,主要代码如下(位于ActivityGroupDemo.java中):

public GridView gvTopBar;
private TabBarAdapter topImgAdapter;
/** 顶部菜单 **/<br abp="804" /> 	int[] topbar_menu_array = { R.string.black_list,R.string.white_list,<br abp="805" />   	R.string.call_info,<br abp="806" />   	R.string.setting };
@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		gvTopBar = (GridView) this.findViewById(R.id.gvTopBar);
		gvTopBar.setNumColumns(topbar_menu_array.length);// 设置每行列数
		gvTopBar.setSelector(new ColorDrawable(Color.TRANSPARENT));// 选中的时候为透明色
		gvTopBar.setGravity(Gravity.CENTER);// 位置居中
		
		int width = this.getWindowManager().getDefaultDisplay().getWidth()
					/ topbar_menu_array.length;
		topImgAdapter = new TabBarAdapter(this, topbar_menu_array, width, 48,
				R.drawable.menu_background);
		gvTopBar.setAdapter(topImgAdapter);// 设置菜单Adapter
	}

            这样,顶部菜单的功能就已完成,并且,你点击某个菜单时,会有选中时的效果,如图中所示,这里同样使用的是.9.png图片。

 

             2)将四个Activity添加进ActivityGroup,并点击相应的分布标签,进入对应的activity,四个Activity的代码不用多说,就是加载布局文件而已,主要看activityGroup中代码:

public LinearLayout container;// 装载sub Activity的容器
<pre class="java" name="code" abp="813">	gvTopBar.setOnItemClickListener(new ItemClickEvent());// 项目点击事件
	container = (LinearLayout) findViewById(R.id.Container);
    	SwitchActivity(0);//默认打开第0页




class ItemClickEvent implements OnItemClickListener {

		@SuppressLint("NewApi") public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			SwitchActivity(arg2);
			
		}
	}
	/**
	 * 根据ID打开指定的Activity
	 * @param id GridView选中项的序号
	 */
	void SwitchActivity(int id)
	{
		topImgAdapter.SetFocus(id);//选中项获得高亮
		container.removeAllViews();//必须先清除容器中所有的View
		Intent intent =null;
		if (id == 0 ) 
			intent = new Intent(ActivityGroupDemo.this, BlackListActivity.class);
		
		else if (id == 1)
			intent = new Intent(ActivityGroupDemo.this,WhiteListActivity.class);
		else if (id == 2) 
			intent = new Intent(ActivityGroupDemo.this, CallInfo.class);
		else if (id == 3)
			intent = new Intent(ActivityGroupDemo.this, SettingActivity.class);
		
		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		//Activity 转为 View
		Window subActivity = getLocalActivityManager().startActivity(
				"subActivity", intent);
		//容器添加View
		container.addView(subActivity.getDecorView(),
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
	}

          其实,就是利用Intent跳转页面,并将viiew添加进窗口中。

           至此,界面设计部分已完成。