今天先纠正一下前面犯的错误—— WidgetsAdapter,该文件在一步一步学android控件(之一) —— 开始篇中创建,里面出了一个很大的bug,现在才发现 。每次都是添加一个View然后点击测试后Ok就行了,结果今天突然发现点击前面的View也进入最后一个View的界面。修正后的WidgetsAdapter.java内容如下
package com.xy.zt.selfdefinewieget;
import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.xy.zt.selfdefinewieget.data.ViewData;
public class WidgetsAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflater;
ArrayList<ViewData> mLocalData = ViewData.View_Datas;
public WidgetsAdapter(Context context) {
if (context == null) {
throw new IllegalArgumentException(
"in constructor WidgetsAdapter: context mustn't be null !");
}
mContext = context;
mInflater = LayoutInflater.from(mContext);
}
public int getCount() {
return mLocalData.size();
}
public Object getItem(int position) {
if (position < 0 || position >= mLocalData.size())
return null;
return mLocalData.get(position);
}
public long getItemId(int position) {
if (position < 0 || position >= mLocalData.size())
return -1;
return mLocalData.get(position).mViewId;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.view_list_item_layout,
null);
holder = new ViewHolder();
holder.mListItem = (TextView) convertView
.findViewById(R.id.item_view_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
String itemStr = mLocalData.get(position).mViewName;
holder.mListItem.setText(itemStr);
final int curPos = position;
convertView.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
handleItemClicked(mLocalData.get(curPos).mViewId);
}
});
return convertView;
}
static class ViewHolder {
TextView mListItem;
}
private void handleItemClicked(int action) {
Intent intent = new Intent();
switch (action) {
case ViewData.TEXT_VIEW_ID:
intent.setClass(mContext, WidgetTextView.class);
mContext.startActivity(intent);
break;
case ViewData.BUTTON_ID:
intent.setClass(mContext, WidgetButtonActivity.class);
mContext.startActivity(intent);
break;
case ViewData.EDIT_TEXT_ID:
intent.setClass(mContext, WidgetEditTextActivity.class);
mContext.startActivity(intent);
break;
case ViewData.AUTO_COMPLETE_TEXTVIEW_ID:
intent.setClass(mContext, WidgetAutoCompleteActivity.class);
mContext.startActivity(intent);
break;
case ViewData.MULTI_AUTO_COMPLETE_TEXTVIEW_ID:
intent.setClass(mContext, WidgetMultiAutoCompleteActivity.class);
mContext.startActivity(intent);
break;
case ViewData.TOAST_ID:
intent.setClass(mContext, WidgetToastActivity.class);
mContext.startActivity(intent);
break;
case ViewData.IMAGE_VIEW_ID:
intent.setClass(mContext, WidgetImageViewActivity.class);
mContext.startActivity(intent);
break;
case ViewData.IMAGE_BTN_ID:
intent.setClass(mContext, WidgetImgBtnActivity.class);
mContext.startActivity(intent);
break;
case ViewData.GALLERY_ID:
intent.setClass(mContext, WidgetGalleryActivity.class);
mContext.startActivity(intent);
break;
case ViewData.CHRONOMETOR_ID:
intent.setClass(mContext, ChronometerActivity.class);
mContext.startActivity(intent);
break;
}
}
}
以前使用成员变量记录position位置,仔细一看,发现改值一直是最后一个View的Position,所以出现了点击任何View都进入最后一个View的界面。
今天学习控件Chronometer。该类实现了一个简单的计时器。使用时可以指定一个基本时间elapsedRealtime()或者使用默认时基(当前时间)。Chronometer默认的显示格式为“MM:SS”或 “HH:MM:SS”,也可以通过setFormat指定样式。另外,系统还有一个Chronometer.OnChronometerTickListener系统每过一秒中会调用该Listener。下面就时间显示的Format和Listener做一个简单的使用案例,先看效果图
当前显示的是默认样式,点击使用自定义format显示时间后效果图如下:
接下来一步一步实现该功能:
1、创建当前布局文件widget_chronometer_layout.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" >
<Button
android:id="@+id/default_chronometer_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/default_chronometer_style" />
<Button
android:id="@+id/customer_chronometer_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/customer_chronometer_style" />
<Chronometer
android:id="@+id/show_time_chronometer"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/show_time_in_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2、界面显示activity——ChronometerActivity.java
package com.xy.zt.selfdefinewieget;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;
import android.widget.TextView;
public class ChronometerActivity extends Activity implements OnClickListener,
OnChronometerTickListener {
private Chronometer mChronometer;
private Button mDefault;
private Button mCustomer;
private TextView mSecondView;
static final String FORMAT = "customer format : %s";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widget_chronometer_layout);
i = 0;
init();
}
void init() {
mChronometer = (Chronometer) findViewById(R.id.show_time_chronometer);
mChronometer.start();
mDefault = (Button) findViewById(R.id.default_chronometer_btn);
mDefault.setOnClickListener(this);
mCustomer = (Button) findViewById(R.id.customer_chronometer_btn);
mCustomer.setOnClickListener(this);
mSecondView = (TextView) findViewById(R.id.show_time_in_second);
mChronometer.setOnChronometerTickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.default_chronometer_btn:
mChronometer.setFormat("%s");
break;
case R.id.customer_chronometer_btn:
mChronometer.setFormat(FORMAT);
break;
}
}
public void onChronometerTick(Chronometer chronometer) {
mSecondView.setText("time in seconds :" + (i++));
}
static int i = 0;
}
在未点击按钮时,显示的format为“%s”(默认样式);
点击“自定义format后”使用代码中定义的FORMAT样式;
mChronometer.setOnChronometerTickLister(this)指定了监听器,每当有一个“Tick”动作时就会回调onChronometerTick函数。
今天的主要功能已实现,下面的代码用于完成整个项目:
ViewData.java中添加如下内容:
public static final int CHRONOMETOR_ID = GALLERY_ID + 1;
public static final String CHRONOMETER_NAME = "Chronometer";
private static final ViewData mChronometer = new ViewData(CHRONOMETER_NAME,
CHRONOMETOR_ID);
View_Datas.add(mChronometer);
WidgetsAdapter.java中的handlerItemClicked函数中添加如下内容:
case ViewData.CHRONOMETOR_ID:
intent.setClass(mContext, ChronometerActivity.class);
mContext.startActivity(intent);
break;
Chronometer控件就学到这里,下一个控件DatePicker。