android尽管定义了种类很丰富的控件。可是有的时候这些自己定义的控件还是不能满足我的要求,为了可以适配很多其它的需求,我们须要在原有的基础上进行自己定义控件。

今天我向大家介绍的就是android中最常见的刷新类控件。由于我们近期正在參加一个项目。在项目组长的带领下。我学到了非常多的东西,这对我的android技术的提升非常大,定义一个自己定义控件可能不是非常难。可是怎样让这个自己定义控件更加有效、更加高速地执行。

首先我们须要建立一个自己定义控件类:

package com.example.ui.widget;import com.example.androidtest.R;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;/*** 下拉刷新控件* * @author JeffLee * @version 1.0* @created 2014-10-21*/
public class PullToRefreshListView extends ListView implements OnScrollListener {private final static String TAG = "PullToRefreshListView";private static final int MAX_Y_OVERSCROLL_DISTANCE = 100;private Context mContext;private int mMaxYOverscrollDistance;// 下拉刷新标志private final static int PULL_To_REFRESH = 0;// 松开刷新标志private final static int RELEASE_To_REFRESH = 1;// 正在刷新标志public final static int REFRESHING = 2;// 刷新完毕标志private final static int DONE = 3;private LayoutInflater inflater;private LinearLayout headView;private TextView tipsTextview;private TextView lastUpdatedTextView;private ImageView arrowImageView;private ProgressBar progressBar;// 用来设置箭头图标动画效果private RotateAnimation animation;private RotateAnimation reverseAnimation;// 用于保证startY的值在一个完整的touch事件中仅仅被记录一次private boolean isRecored;private int headContentWidth;private int headContentHeight;private int headContentOriginalTopPadding;private int startY;private int firstItemIndex;private int currentScrollState;private int state;private boolean isBack;public OnRefreshListener refreshListener;public OnLoadMoreListener loadMoreListener;// -- footer viewprivate PullToRefreshFooter mFooterView;private boolean mEnablePullLoad;private boolean mPullLoading = false;private boolean mIsFooterReady = false;private float mFirstY = -1; // save event yprivate boolean bloading = false;public PullToRefreshListView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public PullToRefreshListView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);init(context);}public int getState() {return state;}private void init(Context context) {mContext = context;final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();final float density = metrics.density;mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);// 设置滑动效果animation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());animation.setDuration(200);animation.setFillAfter(true);reverseAnimation = new RotateAnimation(-180, 0,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);inflater = LayoutInflater.from(context);headView = (LinearLayout) inflater.inflate(R.layout.pull_to_refresh_head, null);arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);// arrowImageView.setMinimumWidth(50);// arrowImageView.setMinimumHeight(50);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);headContentOriginalTopPadding = headView.getPaddingTop();measureView(headView);headContentHeight = headView.getMeasuredHeight();headContentWidth = headView.getMeasuredWidth();headView.setPadding(headView.getPaddingLeft(), -1 * headContentHeight,headView.getPaddingRight(), headView.getPaddingBottom());headView.invalidate();addHeaderView(headView);// init footer viewmFooterView = new PullToRefreshFooter(context);setOnScrollListener(this);}@Overridepublic void setAdapter(ListAdapter adapter) {super.setAdapter(adapter);}// 须要有载入很多其它功能时候的设置adapter的方式public void setLoadMoreAdapter(ListAdapter adapter) {setAdapter(adapter);addFooterView();}public void addFooterView() {if (mIsFooterReady == false) {mIsFooterReady = true;mFooterView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 不在下拉刷新状态,以及没有所有载入,且不在载入很多其它的状态下进行点击刷新if (state != REFRESHING && !mPullLoading) { //startLoadMore();}}});addFooterView(mFooterView);}}/*** stop load more, reset footer view.*/// public void stopLoadMore() {// if (mPullLoading == true) {// mPullLoading = false;// mFooterView.setState(XListViewFooter.STATE_NORMAL);// }// }public void completeLoadMore(int status) {if (mPullLoading == true) {state = PULL_To_REFRESH;mPullLoading = false;// mFooterView.setState(status);}mFooterView.setState(status);}public void setFooterState(int status) {mFooterView.setState(status);}public int getFooterState() {return mFooterView.getState();}private void startLoadMore() {// 设置了载入很多其它的监听器,以及载入很多其它状态不是数据载入完毕,和为空数据的时候。都能够进行上滑刷新if (loadMoreListener != null&& mFooterView.getState() != PullToRefreshFooter.STATE_LOADFULL&& mFooterView.getState() != PullToRefreshFooter.STATE_NULL) {mPullLoading = true;state = REFRESHING;mFooterView.setState(PullToRefreshFooter.STATE_LOADING);loadMoreListener.onLoadMore();}}public void settingOnScroll(AbsListView view, int firstVisiableItem,int visibleItemCount, int totalItemCount) {firstItemIndex = firstVisiableItem;// if (firstVisiableItem + visibleItemCount >=// totalItemCount){//currentScrollState == SCROLL_STATE_TOUCH_SCROLL// if (state != REFRESHING// && ! mPullLoading) {// startLoadMore();// }// }}public void settingOnScrollStateChanged(AbsListView view, int scrollState) {currentScrollState = scrollState;if (scrollState == SCROLL_STATE_IDLE && getCount() > 0) {// 推断滚动究竟部if (view.getLastVisiblePosition() == (view.getCount() - 1)) {if (state != REFRESHING && !mPullLoading) {startLoadMore();}}}}@Overridepublic void onScroll(AbsListView view, int firstVisiableItem,int visibleItemCount, int totalItemCount) {settingOnScroll(view, firstVisiableItem, visibleItemCount,totalItemCount);}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {settingOnScrollStateChanged(view, scrollState);}public final boolean getLoadingState() {return bloading;}public final void setLoadingState(boolean bloading) {// Log.i(TAG, "setLoadingState bloading =" + bloading);this.bloading = bloading;}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (mFirstY == -1) {mFirstY = event.getRawY();}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (firstItemIndex == 0 && !isRecored) {startY = (int) event.getY();isRecored = true;}break;case MotionEvent.ACTION_CANCEL:// 失去焦点&取消动作case MotionEvent.ACTION_UP:if (state != REFRESHING) {if (state == DONE) { // 当前-抬起-ACTION_UP:DONE什么都不做} else if (state == PULL_To_REFRESH) { // 当前-抬起-ACTION_UP:PULL_To_REFRESH-->DONE-由下拉刷新状态到刷新完毕状态state = DONE;changeHeaderViewByState();} else if (state == RELEASE_To_REFRESH) { // 当前-抬起-ACTION_UP:RELEASE_To_REFRESH-->REFRESHING-由松开刷新状态,到刷新完毕状态state = REFRESHING;changeHeaderViewByState();onRefresh();}final float deltaY = event.getRawY() - mFirstY;if ((deltaY < 0) && !mPullLoading&& getLastVisiblePosition() == getCount() - 1) {startLoadMore();}mFirstY = -1; // reset}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) event.getY();if (!isRecored && firstItemIndex == 0) {isRecored = true;startY = tempY;}// 假设正在载入,则不能进行刷新操作if (bloading) {break;}// Log.i(TAG,"tempY =" + tempY +";startY = "+startY);if (state != REFRESHING && isRecored) {// 能够松开刷新了if (state == RELEASE_To_REFRESH) {// 往上推,推到屏幕足够掩盖head的程度。但还没有所有掩盖if ((tempY - startY < headContentHeight + 20)&& (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();} else if (tempY - startY <= 0) { // 一下子推到顶state = DONE;changeHeaderViewByState();} else { // 往下拉,或者还没有上推到屏幕顶部掩盖head// 不用进行特别的操作,仅仅用更新paddingTop的值即可了}} else if (state == PULL_To_REFRESH) { // 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态// 下拉到能够进入RELEASE_TO_REFRESH的状态if (tempY - startY >= headContentHeight + 20) {state = RELEASE_To_REFRESH;isBack = true;changeHeaderViewByState();}// 上推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();}} else if (state == DONE) { // done状态下if (tempY - startY > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}}// 更新headView的sizeif (state == PULL_To_REFRESH) {int topPadding = ((-1 * headContentHeight + (tempY - startY)));headView.setPadding(headView.getPaddingLeft(), topPadding,headView.getPaddingRight(),headView.getPaddingBottom());headView.invalidate();}// 更新headView的paddingTopif (state == RELEASE_To_REFRESH) {int topPadding = ((tempY - startY - headContentHeight));if (topPadding > mMaxYOverscrollDistance)topPadding = mMaxYOverscrollDistance;headView.setPadding(headView.getPaddingLeft(), topPadding,headView.getPaddingRight(),headView.getPaddingBottom());headView.invalidate();}}break;default:break;}if (state == RELEASE_To_REFRESH) {return true;}return super.onTouchEvent(event);}// 当状态改变时候,调用该方法。以更新界面private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:arrowImageView.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.startAnimation(animation);tipsTextview.setText(R.string.pull_to_refresh_release_label);break;case PULL_To_REFRESH:progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.VISIBLE);if (isBack) {isBack = false;arrowImageView.clearAnimation();arrowImageView.startAnimation(reverseAnimation);}tipsTextview.setText(R.string.pull_to_refresh_pull_label);break;case REFRESHING:headView.setPadding(headView.getPaddingLeft(),headContentOriginalTopPadding, headView.getPaddingRight(),headView.getPaddingBottom());headView.invalidate();progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText(R.string.pull_to_refresh_refreshing_label);lastUpdatedTextView.setVisibility(View.GONE);break;case DONE: {headView.setPadding(headView.getPaddingLeft(), -1* headContentHeight, headView.getPaddingRight(),headView.getPaddingBottom());progressBar.setVisibility(View.GONE);arrowImageView.clearAnimation();// 此处更换图标// arrowImageView.setImageResource(R.drawable.ic_pulltorefresh_arrow);Bitmap arrow = BitmapFactory.decodeResource(getResources(),R.drawable.ic_pulltorefresh_arrow);Drawable background = new BitmapDrawable(arrow);arrowImageView.setBackgroundDrawable(background);tipsTextview.setText(R.string.pull_to_refresh_pull_label);lastUpdatedTextView.setVisibility(View.VISIBLE);headView.invalidate();}break;}}// 点击刷新public void clickRefresh() {setSelection(0);state = REFRESHING;changeHeaderViewByState();onRefresh();}public void setOnRefreshListener(OnRefreshListener refreshListener) {this.refreshListener = refreshListener;}public void setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) {this.loadMoreListener = loadMoreListener;}public interface OnRefreshListener {public void onRefresh();}public interface OnLoadMoreListener {public void onLoadMore();}public void onRefreshComplete(String update) {lastUpdatedTextView.setText(update);onRefreshComplete();}public void firstRefreshing() {state = REFRESHING;headView.setPadding(0, 10, 0, 0);progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText(R.string.pull_to_refresh_refreshing_label);lastUpdatedTextView.setVisibility(View.GONE);}/*** stop refresh, reset header view.*/public void stopRefresh() {state = PULL_To_REFRESH;changeHeaderViewByState();}public void onRefreshComplete() {state = DONE;changeHeaderViewByState();setSelection(0);}public void onRefreshComplete(int loadMoreStatus) {onRefreshComplete();mFooterView.setState(loadMoreStatus);}private void onRefresh() {if (refreshListener != null) {refreshListener.onRefresh();}}// 计算headView的width及height值private void measureView(View child) {ViewGroup.LayoutParams p = child.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);int lpHeight = p.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}/** @Override protected boolean overScrollBy(int deltaX, int deltaY, int* scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int* maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { // This is* where the magic happens, we have replaced the incoming // maxOverScrollY* with our own custom variable mMaxYOverscrollDistance;* * return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,* scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); }*/
}

以下是pull_to_refresh_head.xml文件:

<?xml version="1.0" encoding="utf-8"?

> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:focusable="false" android:orientation="vertical" > <RelativeLayout android:id="@+id/head_contentLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingBottom="10dip" android:paddingTop="10dip" > <ImageView android:id="@+id/head_arrowImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerVertical="true" android:layout_marginLeft="50dp" android:background="@drawable/ic_pulltorefresh_arrow" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="100dip" android:layout_marginRight="10dip" android:paddingBottom="10dip" android:paddingTop="10dip" > <ProgressBar android:id="@+id/head_progressBar" style="@style/loading_small" android:visibility="gone" /> </FrameLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center_horizontal" android:orientation="vertical" > <TextView android:id="@+id/head_tipsTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pull_to_refresh_pull_label" android:textColor="@color/list_title" /> <TextView android:id="@+id/head_lastUpdatedTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/list_title" android:textSize="10sp" android:visibility="gone" /> </LinearLayout> </RelativeLayout> </LinearLayout>

package com.example.ui.widget;import com.example.androidtest.R;import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;public class PullToRefreshFooter extends RelativeLayout {public final static int STATE_NORMAL = 0; //正常状态,还有很多其它须要载入public final static int STATE_READY = 1;public final static int STATE_LOADING = 2; //正在载入中public final static int STATE_LOADFULL = 3;//数据所有载入完public final static int STATE_NULL = 4;//没有数据,初始状态private Context mContext;private View mContentView;private View mProgressBar;private TextView mHintView;private int state;public PullToRefreshFooter(Context context) {super(context);initView(context);setVisibility(View.GONE);}public PullToRefreshFooter(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public void setState(int state) {this.state = state;
//      mHintView.setVisibility(View.INVISIBLE);
//      mProgressBar.setVisibility(View.INVISIBLE);
//      mHintView.setVisibility(View.INVISIBLE);mProgressBar.setVisibility(View.GONE);mHintView.setVisibility(View.VISIBLE);setVisibility(View.VISIBLE);if (state == STATE_READY) {mHintView.setText(R.string.load_ready);} else if (state == STATE_LOADING) {mProgressBar.setVisibility(View.VISIBLE);mHintView.setText(R.string.load_ing);} else if (state == STATE_LOADFULL){mHintView.setText(R.string.load_full);} else if (state == STATE_NULL) {mHintView.setText(R.string.load_empty);//setVisibility(View.GONE);} else {mHintView.setText(R.string.load_more);}}public int getState() {return state;}public void setBottomMargin(int height) {if (height < 0) return ;RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mContentView.getLayoutParams();lp.bottomMargin = height;mContentView.setLayoutParams(lp);}public int getBottomMargin() {RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mContentView.getLayoutParams();return lp.bottomMargin;}/*** normal status*/public void normal() {mHintView.setVisibility(View.VISIBLE);mProgressBar.setVisibility(View.GONE);}/*** loading status */public void loading() {mHintView.setVisibility(View.GONE);mProgressBar.setVisibility(View.VISIBLE);}/*** hide footer when disable pull load more*/public void hide() {RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mContentView.getLayoutParams();lp.height = 0;mContentView.setLayoutParams(lp);}/*** show footer*/public void show() {RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mContentView.getLayoutParams();lp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;mContentView.setLayoutParams(lp);}private void initView(Context context) {mContext = context;RelativeLayout moreView = (RelativeLayout)LayoutInflater.from(mContext).inflate(R.layout.listview_footer, null);addView(moreView);moreView.setLayoutParams(new RelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));mContentView = moreView.findViewById(R.id.listview_foot_content);mProgressBar = moreView.findViewById(R.id.listview_foot_progress);mHintView = (TextView)moreView.findViewById(R.id.listview_foot_more);}}

以下是listview_footer.xml文件:

<?xml version="1.0" encoding="utf-8"?

> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview_foot_content" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="3dp" android:clickable="true" android:focusable="false"> <TextView android:id="@+id/listview_foot_more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="5dp" android:textColor="@color/list_subTitle" android:text="@string/load_empty"/> <ProgressBar android:id="@+id/listview_foot_progress" android:layout_toLeftOf="@id/listview_foot_more" android:layout_centerVertical="true" style="@style/loading_small"/> </RelativeLayout>

然后我们就能够使用这个刷新类的自己定义控件了。

<?

xml version="1.0" encoding="utf-8"?> <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=".PullRefreshActivity" > <com.example.ui.widget.PullToRefreshListView android:id="@+id/listview" style="@style/common_listview" android:layout_width="match_parent" android:divider="@drawable/divided_line" android:dividerHeight="1dp" android:listSelector="@drawable/listview_item_nocolor_selector" android:paddingLeft="8dp" android:paddingRight="8dp" android:scrollbars="none" > </com.example.ui.widget.PullToRefreshListView> </LinearLayout>

然后再Activity中载入这个控件:

package com.example.androidtest;import com.example.ui.adapter.PullRefreshAdapter;
import com.example.ui.widget.PullToRefreshListView;
import com.example.ui.widget.PullToRefreshListView.OnRefreshListener;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;public class PullRefreshActivity extends Activity {private Context mContext;private PullRefreshAdapter pullRefreshAdapter;private PullToRefreshListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_pulltorefresh);initView();initListView();}private void initView() {mContext = this;listView = (PullToRefreshListView) findViewById(R.id.listview);}private void initListView() {pullRefreshAdapter = new PullRefreshAdapter(mContext);listView.setLoadMoreAdapter(pullRefreshAdapter);listView.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh() {// TODO Auto-generated method stubToast.makeText(mContext, "哈哈", Toast.LENGTH_SHORT).show();}});}
}
package com.example.ui.adapter;import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;public class PullRefreshAdapter extends BaseAdapter {private Context mContext;public PullRefreshAdapter(Context context) {super();this.mContext = context;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubreturn null;}}

得到的效果例如以下:

上面显示出来了载入刷新的功能,能够在须要刷新的时候显示这个控件。这样对UI显示地比較方面。

因为时间比較仓促,临时先放上源代码,以后再好好分析源代码。请大家多多不吝赐教。

android自己定义刷新类控件相关推荐

  1. android没有输入焦点类控件的输入法调用,Android 手机下输入框获取焦点时, 输入法会挡住输入框...

    // Android 手机下输入框获取焦点时, 输入法会挡住输入框 // 解决方法: // Android 手机下, input 或 textarea 元素聚焦时, 主动滚动 if (/Android ...

  2. android switch 未定义,源生Switch控件在Android4.4无法显示?

    首先,layout.xml代码如下: xmlns:tools="http://schemas.android.com/tools" android:layout_width=&qu ...

  3. android 电量控件,Android实现显示电量的控件代码

    下面介绍了Android实现显示电量的控件代码,具体代码如下: 1.目录结构,本人是使用安卓死丢丢. 2.运行界面,输入框中输入数值,点击刷新,会再电池中显示出相应的电量 3.绘制自定义电池控件,首先 ...

  4. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  5. [android] 解决DatePickerDialog和TimePickerDialog控件取消按钮问题

    一. 问题提出       在Android程序中,我们通常需要使用DatePicker来设置日期,TimePicker来设置时间.其基本步骤是:              1.先定义DatePick ...

  6. SAP UI5 进阶 - XML 视图里定义的 UI 控件,运行时实例化的技术细节剖析试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...

  7. 消息提示类控件使用之Toast(吐司)的简单使用

    (一)概述 Android用于提示信息的一个控件--Toast(吐司)!Toast是一种很方便的消息提示框,会在 屏幕中显示一个消息提示框,没任何按钮,也不会获得焦点一段时间过后自动消失! 非常常用! ...

  8. Adapter类控件使用之ExpandableList(可折叠式列表)的基本使用

    (一)概述 本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是 ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包 ...

  9. Study on Android【四】--显示控件使用

    Android的界面显示同样也是基于控件的.通常是用View(包括ViewGroup)控件配上XML的样式来做的.具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的 ...

最新文章

  1. 如何给iOS 分类添加 属性
  2. 298.2亿美元的机器人市场,为什么过得有点“惨”
  3. apache开启gzip压缩
  4. java outofmemory jsp_Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结...
  5. linux编译安装zabbix,Linux安装zabbix--CentOS7.3
  6. 【转载】Linux free 查询可用内存和判断是否有内存泄漏
  7. 捕获input 文本框内容改变的事件(onchange,onblur,onPropertyChange比较)
  8. 本地微信公众号授权登录获取code步骤
  9. ccf 节日 java 思路
  10. CSDN的C1-见习工程师能力认证相关知识(框架)
  11. 摩根大通从AWS和Azure挖人,云计算人才大战开始
  12. 编写一个程序,完成字符大小写的转换。
  13. [ansible系列③]Ansible Inventory配置及详解
  14. 数据结构-排序算法总结与感悟
  15. overleaf表格_搞定LaTeX论文中的表格
  16. 五大管理过程,十大知识领域
  17. 平步青云:Windows Azure(二)
  18. 考研语法整理(简洁版)
  19. 【基础】秦九昭算法实现的多项式快速计算
  20. 关于window10和爱剪辑软件的兼容出错问题。

热门文章

  1. 虚拟化--046 利用web client查看存储
  2. 最适合你性格的职业类型是什么?
  3. java接口测试入门
  4. 防止非法链接(referer)
  5. 双11大幕拉开,菜鸟智能机器人也将测试运行
  6. Hive On Tez,Tez 和 MapReduce engine 性能对比
  7. 关于autorelease pool一个较好的理解
  8. 【oracle笔记3】多表查询
  9. 最简单的iOS网络请求
  10. Oracle 的 DBMS_SCN 修正以及 SCN 的 auto-rollover 新特性