`

Android弹出窗口与QQ好友分组列表(21)

阅读更多
  • 弹出窗口,其实就是在改变某一状态弹出的窗口

首先定义Popupwindow的布局文件popupwindow.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/popinfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请选择您的状态" />

    <RadioGroup
        android:id="@+id/changestatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/online"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="在线" />

        <RadioButton
            android:id="@+id/offline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="离线" />

        <RadioButton
            android:id="@+id/stealth"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="隐身" />
    </RadioGroup>

    <Button
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消" />

</LinearLayout>

 然后是main的主布局文件,我们一个组件显示状态,一个改变状态

 

 

 

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

    <TextView
          android:id="@+id/statusinfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="当前用户状态:在线" />

    <Button
        android:id="@+id/popbut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="状态" />

</LinearLayout>

 

Activity代码:

public class MainActivity extends Activity {

	private Button popbut=null;//状态改变按钮
	private RadioGroup changestatus=null;//选项
	private TextView statusinfo=null;//显示状态
	private Button cancel=null;//关闭弹出
	private PopupWindow popwin=null;//弹出窗口
	private View popview=null;//定义弹出窗口view
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.popbut=(Button)super.findViewById(R.id.popbut);//状态按钮
		this.statusinfo=(TextView)super.findViewById(R.id.statusinfo);//显示状态
		this.popbut.setOnClickListener(new OnClickListenerlmpl());
	}

	private class OnClickListenerlmpl implements OnClickListener{

		@Override
		public void onClick(View arg0) {
		LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
		popview=inflater.inflate(R.layout.popwindow, null);
		popwin=new PopupWindow(popview,300,200);//popview视图显示在弹出窗口上
		changestatus=(RadioGroup)popview.findViewById(R.id.changestatus);
		cancel=(Button)popview.findViewById(R.id.cancel);
	    changestatus.setOnCheckedChangeListener(new Check());
	    cancel.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				popwin.dismiss();//关掉弹出窗口
				
			}
	    	
	    });
	    popwin.showAtLocation(popbut, Gravity.CENTER, 0,0);//显示弹出窗口
	    
		
		
			
		}
		
	}
	private class Check implements OnCheckedChangeListener{

		@Override
		public void onCheckedChanged(RadioGroup group, int ischeckedid) {
			//得到选中按钮
			RadioButton but=(RadioButton)MainActivity.this.popview.findViewById(group.getCheckedRadioButtonId());
			statusinfo.setText("当前用户状态:"+but.getText().toString());
			popwin.dismiss();
			
		}
		
	}
	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;
	}

}

 

这里讲一下:LayoutInflater

 

其实在Activity里面就使用了LayoutInflater来载入界面, 通过getSystemService(Context.LAYOUT_INFLATER_SERVICE)方法可以获得一个 LayoutInflater, 也可以通过LayoutInflater inflater = getLayoutInflater();来获得.然后使用inflate方法来载入layout的xml, 

 
 
 
首先我们要知道,什么是已经被载入的layout,什么是还没有载入的.我们启动一个应用,与入口Activity相关的layout{常见的是main.xml}就是被载入的,即在Oncreate()中的.而其他的layout是没有被载入的.就要动态载入了或通过另一个activity.
 
在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于 findViewById(),
不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件.
实现效果如下:


 
  • 接下来我们来认识树型组件:ExpandableListView

我们敏锐的观察到后缀的listview,listview虽然能给用户提供列表显示功能,但是相对列表数据进行分类管理,则要使用树型组件了

这也是我们做QQ好友分组列表的基础,接下来上手:

与listview一样,先定义适配器:

public class ListAdapter extends BaseExpandableListAdapter{

	private String[] group={"我的好友","家人","蓝杰","黑名单"};
	private String[][] children={{"豆豆","婷婷","图图","乐乐",},{"父亲","母亲","三婶","四叔",},
			{"胡哥","强哥","熊哥",},{"前男友","前女友"}};
	private Context context=null;//保存上下文对象
	public ListAdapter(Context context){
		this.context=context;
	}
	
	public Object getChild(int groupPosition, int childPosition) {     //取得指定子项
		// TODO Auto-generated method stub
		return this.children[groupPosition][childPosition];
	}

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

	@Override
	public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
			ViewGroup parent) {
		TextView textView = this.buildTextView() ;
		textView.setText(this.getChild(groupPosition, childPosition).toString()) ;
		return textView;

	}
	public TextView buildTextView(){
		AbsListView.LayoutParams params = new AbsListView.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT, 35);//指定布局参数
		TextView textView = new TextView(this.context) ;//创建textview
		textView.setLayoutParams(params) ;
		textView.setTextSize(15.0f) ;
		textView.setGravity(Gravity.LEFT) ;//左对齐
		textView.setPadding(40, 8, 3, 3) ;//间距
		return textView ;

	}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		return this.children[groupPosition].length;
	}

	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return this.group[groupPosition];
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return this.group.length;
	}

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

	@Override
	public View getGroupView(int groupPosition, boolean arg1, View arg2, ViewGroup arg3) {
		TextView textView = this.buildTextView() ;
		textView.setText(this.getGroup(groupPosition).toString()) ;
	
		return textView;

	}

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

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

}

 

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    
    tools:context=".MainActivity" >

    <ExpandableListView
        android:id="@+id/eListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ExpandableListView>

</LinearLayout>

 

Activity:

public class MainActivity extends Activity {

	private ExpandableListView elistview = null;
	private ExpandableListAdapter adapter = null;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.elistview = (ExpandableListView) super
				.findViewById(R.id.eListView);
		this.adapter = new ListAdapter(this);
		this.elistview.setAdapter(this.adapter);

		this.elistview.setOnChildClickListener(new OnChildClickListenerImpl());
		this.elistview.setOnGroupClickListener(new OnGroupClickListenerImpl());
		this.elistview
				.setOnGroupExpandListener(new OnGroupExpandListenerImpl());
		this.elistview
				.setOnGroupCollapseListener(new OnGroupCollapseListenerImpl());
	}

	private class OnChildClickListenerImpl implements OnChildClickListener {

		@Override
		public boolean onChildClick(ExpandableListView parent, View v,
				int groupPosition, int childPosition, long id) {
			Toast.makeText(
					MainActivity.this,
					"子选项被选中,groupPosition = " + groupPosition
							+ ",childPosition = " + childPosition,
					Toast.LENGTH_SHORT).show();
			return false;
		}

	}
	private class OnGroupClickListenerImpl implements OnGroupClickListener {

		@Override
		public boolean onGroupClick(ExpandableListView parent, View v,
				int groupPosition, long id) {
			Toast.makeText(MainActivity.this,
					"分组被选中,groupPosition = " + groupPosition,
					Toast.LENGTH_SHORT).show();
			return false;
		}

	}

	private class OnGroupExpandListenerImpl implements OnGroupExpandListener {

		@Override
		public void onGroupExpand(int groupPosition) {
			Toast.makeText(MainActivity.this,
					"打开分组,groupPosition = " + groupPosition, Toast.LENGTH_SHORT)
					.show();

		}

	}

	private class OnGroupCollapseListenerImpl implements
			OnGroupCollapseListener {

		@Override
		public void onGroupCollapse(int groupPosition) {
			Toast.makeText(MainActivity.this,
					"关闭分组,groupPosition = " + groupPosition, Toast.LENGTH_SHORT)
					.show();

		}

	}
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
		int type = ExpandableListView
				.getPackedPositionType(info.packedPosition); // 取得菜单项
		int group = ExpandableListView
				.getPackedPositionGroup(info.packedPosition); // 取得所在组的索引
		int child = ExpandableListView
				.getPackedPositionChild(info.packedPosition); // 取得子菜单项的索引
		Toast.makeText(MainActivity.this,
				"type = " + type + ",group = " + group + ",child = " + child,
				Toast.LENGTH_SHORT).show();
	}



	@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;
	}

}

 

实现效果如下:



 

 

 


  •  
 
  • 大小: 14.2 KB
  • 大小: 21.1 KB
  • 大小: 17.5 KB
  • 大小: 20.6 KB
1
1
分享到:
评论

相关推荐

    即时通信系统GGTalk(支持PC和Android,高仿QQ)源码 GGRealTimeCommunication.rar

    18、好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 19、打开聊天窗口时,自动显示上次交谈的最后一句话。 20、输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入...

    qq主界面--主要点击事件的截取

    1. **聊天窗口的打开**:当用户点击联系人列表中的某一好友时,通常会触发聊天窗口的弹出。这个过程涉及到事件监听、事件传递以及UI组件的动态加载。开发者需要确保点击事件的准确性,避免误触其他功能。 2. **功能...

    GGTalk即时通信系统 GGRealTimeCommunicationGGTalk5.rar

    18、好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 19、打开聊天窗口时,自动显示上次交谈的最后一句话。 20、输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入...

    gg2014即时聊天

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)打开聊天窗口时,自动显示上次交谈的最后一句话。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方...

    GG即时通讯系统GGTalk 6.2 源码版.rar

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在...

    GG即时通讯系统GGTalk v6.2.zip

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)打开聊天窗口时,自动显示上次交谈的最后一句话。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方...

    C# 可在广域网部署运行的即时通讯系统GGTalk-V6.0

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)打开聊天窗口时,自动显示上次交谈的最后一句话。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在...

    GG即时通讯系统GGTalk 7.0 源码版

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在...

    GG即时通讯系统GGTalk 7.0 部署版

    (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在...

    jquery.mobile

    - **对话框(Dialog)**: 实现类似 iOS 弹出窗口的效果,用于显示详细信息或进行用户确认。 - **表格(Table)**: 可以创建响应式的表格布局,适应不同屏幕尺寸,与 iOS 的表格控件相仿。 - **表单(Form)**: ...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

Global site tag (gtag.js) - Google Analytics