一、组合控件
1.先建立一个布局来盛放你所需要的控件。
<?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:id="@+id/title"
android:background="@android:color/holo_orange_dark">
<Button
android:id="@+id/title_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_centerVertical="true"
android:text="Back"
/>
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="This is a Title"
android:textSize="25sp"/>
</RelativeLayout>
2.建立一个类来管理你的布局文件,通常这个类需要继承FrameLayout。即,
package com.wangpei.fragment;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
/**
* 作者:WangPei on 2015/7/8 14:16
* 邮箱:460977141@qq.com
*
* 组合控件的使用
*/
public class TitleView extends FrameLayout {
private Button btn;
private TextView text;
public TitleView(Context context,AttributeSet attributes) {
super(context,attributes);
View view = LayoutInflater.from(context).inflate(R.layout.title, this);
btn = (Button) view.findViewById(R.id.title_btn);
text = (TextView) view.findViewById(R.id.title_text);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity) getContext()).finish();
}
});
}
public void setBtnText(String str){
btn.setText(str);
}
public void setTextText(String str){
text.setText(str);
}
public void setOnClickListener(OnClickListener listener){
btn.setOnClickListener(listener);
}
}<pre name="code" class="java">
3.在你的主布局文件中使用自定义的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.wangpei.fragment.TitleView
android:id="@+id/title_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.wangpei.fragment.TitleView>
</LinearLayout>
二、继承控件
1.首先,创建在原有控件上你需要的增加的控件布局文件。比如,我需要一个Button加在ListView上面。则需要:
<?xml version="1.0" encoding="utf-8"?>
2 <Button xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:text="Delete"
6 android:id="@+id/delete_btn"
7 android:background="@android:color/holo_orange_light">
8
9 </Button>
2.这里,我们需要的是一个ListView,所以,创建一个myListView并继承于ListView。
package com.wangpei.fragment;
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
/**
* 作者:WangPei on 2015/7/8 14:40
* 邮箱:460977141@qq.com
*/
public class myListView extends ListView implements View.OnTouchListener,GestureDetector.OnGestureListener{
private GestureDetector gestureDetector;
private boolean isDeleteshowed;//判断item是否被删除
private ViewGroup viewGroup;//Item组
private View deleteBtn;//删除按钮
private int selectItem;//选中的Item
private OnDeleteListener listener;//自定义接口
public myListView(Context context, AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(context,this);//初始化手势监听
setOnTouchListener(this);//添加触摸事件
}
public void setOnDeleteListener(OnDeleteListener l) {
listener = l;//传递事件
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(isDeleteshowed){//如果被删除了
viewGroup.removeView(deleteBtn);
deleteBtn = null;
isDeleteshowed = false;
return false;
}else {//如果item没有被删除,则将手势事件添加到Item上
return gestureDetector.onTouchEvent(event);
}
}
@Override
public boolean onDown(MotionEvent e) {
if (!isDeleteshowed) {//取得Item的位置
selectItem = pointToPosition((int) e.getX(), (int) e.getY());
}
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(!isDeleteshowed && Math.abs(velocityX) > Math.abs(velocityY)){
deleteBtn = LayoutInflater.from(getContext()).inflate(R.layout.delete_btn,null);
deleteBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewGroup.removeView(deleteBtn);
deleteBtn = null;
isDeleteshowed = false;
listener.onDelete(selectItem);
}
});
//取得可见的Item组
viewGroup = (ViewGroup) getChildAt(selectItem - getFirstVisiblePosition());
//动态的把删除按钮附加在当前滑动的item上
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
viewGroup.addView(deleteBtn,params);
isDeleteshowed = true;
}
return false;
}
public interface OnDeleteListener{//自定义接口,增加的按钮的删除操作,具体逻辑在MainActivity中使用该接口来实现
void onDelete(int index);
}
}
3.创建Adpater类,来进行数据适配器的定义:
package com.wangpei.fragment;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
/**
* 作者:WangPei on 2015/7/8 15:16
* 邮箱:460977141@qq.com
*/
public class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(R.layout.my_list_item,null);
}else{
view = convertView;
}
TextView textView = (TextView) view.findViewById(R.id.item_text);
textView.setText(getItem(position));
return view;
}
}
4.在MainActivity中初始化你自定义的ListView即可:
package com.wangpei.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
/**
*
* 使用getActivity()来获得让Fragment关联到的Activity,然后通过这个Activity来获取相关的空间ID
*
*
*/
public class MainActivity extends Activity {
private static final String TAG = "myInfo";
private LinearLayout main;
private List<String> contentList = new ArrayList<String>();
private myListView myListView;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main4);
initList();
myListView = (myListView) findViewById(R.id.my_list);
//使用自定义的接口
myListView.setOnDeleteListener(new myListView.OnDeleteListener() {
@Override
public void onDelete(int index) {
contentList.remove(index);
myAdapter.notifyDataSetChanged();
}
});
myAdapter = new MyAdapter(this,0,contentList);
myListView.setAdapter(myAdapter);
}
//添加数据
private void initList() {
contentList.add("Content Item 1");
contentList.add("Content Item 2");
contentList.add("Content Item 3");
contentList.add("Content Item 4");
contentList.add("Content Item 5");
contentList.add("Content Item 6");
contentList.add("Content Item 7");
contentList.add("Content Item 8");
contentList.add("Content Item 9");
contentList.add("Content Item 10");
contentList.add("Content Item 11");
contentList.add("Content Item 12");
contentList.add("Content Item 13");
contentList.add("Content Item 14");
contentList.add("Content Item 15");
contentList.add("Content Item 16");
contentList.add("Content Item 17");
contentList.add("Content Item 18");
contentList.add("Content Item 19");
contentList.add("Content Item 20");
}
}