作业要求是用tab和grid做一个课程表app,而且要在grid下显示一个虚拟时钟,要求比较简单而且自由,我自己加了些其他功能进去,这次自我学习让我学习到了很多东西,包括动态生成UI等的实现方法,效率方面是我编程生涯一直以来时刻都在考虑的东西,这次的代码也能很好的体现出来,当然里面的TextView控件可以控制在一个tab内的级别,由于有些疏懒而直接把所有Grid内的TextView都独立出来了.
后记:倒回来编辑之前的作业,发现很多地方都不成熟,例如Adapter的getview方法,最好使用holder的设计方法来防止内存泄露(http://blog.csdn.net/syfyw/article/details/8145653).而且数据储存入sqlite更加好.
界面视图:
(虚拟机下)
(实机测试)
MainActivity代码:
package com.fp.homework2;
import android.os.Bundle;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.widget.BaseAdapter;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.GridView;
import android.widget.AnalogClock;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.EditText;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Gravity;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class MainActivity extends TabActivity implements TabHost.TabContentFactory {
private TabHost tabHost;
private GridView grid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getGridTextViews();
tabHost = getTabHost();
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("星期一", getResources().getDrawable(R.drawable.star_big_on))
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab2")
.setIndicator("星期二", getResources().getDrawable(R.drawable.star_big_on))
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab3")
.setIndicator("星期三", getResources().getDrawable(R.drawable.star_big_on))
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab4")
.setIndicator("星期四", getResources().getDrawable(R.drawable.star_big_on))
.setContent(this));
tabHost.addTab(tabHost.newTabSpec("tab5")
.setIndicator("星期五", getResources().getDrawable(R.drawable.star_big_on))
.setContent(this));
Toast.makeText(MainActivity.this, "点击可修改具体课程",Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
saveToFile();
Toast.makeText(MainActivity.this, "已保存课表信息",Toast.LENGTH_SHORT).show();
super.onDestroy();
}
public void saveToFile()
{
SharedPreferences preferences = getSharedPreferences("classinfo",0);
Editor edit=preferences.edit();
for(int i=0;i<5;i++)
{
for(int j=0;j<35;j++)
{
if(((j>5)&&(j<9))||((j>10)&&(j<14))||((j>15)&&(j<19))||((j>20)&&(j<24))||((j>25)&&(j<29))||((j>30)&&(j<34)))
{
if(tv[i][j].getText().toString()!="点击添加")
edit.putString(i+","+j, tv[i][j].getText().toString());
}
}
}
edit.commit();
}
//创建用于网格视图的TextViews
public TextView tempview;
private void getGridTextViews()
{
tv = new TextView[5][35];
SharedPreferences preferences = getSharedPreferences("classinfo",0);
View.OnTouchListener tl = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
v.setBackgroundColor(0xffCDCDFF);
}
else
v.setBackgroundColor(0xffffffff);
return false;
}
};
View.OnClickListener cl = new View.OnClickListener() {
@Override
public void onClick(View v) {
tempview = (TextView)v;
LinearLayout ll = new LinearLayout(MainActivity.this);
TextEntry = new EditText(MainActivity.this);
TextEntry.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
ll.addView(TextEntry);
new AlertDialog.Builder(MainActivity.this)
.setTitle("请输入")
.setView(ll)
.setPositiveButton("确定",new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,int whichButton) {
tempview.setText(TextEntry.getText().toString());
tempview.setTextColor(0xff000000);
tempview.setTextSize(15);
}
})
.setNegativeButton("取消",new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,int whichButton) {}
})
.create()
.show();
}
};
for(int i=0;i<5;i++)
{
int constrid = 0;
for(int j=0;j<35;j++)
{
tv[i][j] = new TextView(this);
tv[i][j].setGravity(Gravity.CENTER);
tv[i][j].setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.FILL_PARENT, 100));
tv[i][j].setBackgroundColor(0xffffffff); //设置背景颜色
if(((j>5)&&(j<9))||((j>10)&&(j<14))||((j>15)&&(j<19))||((j>20)&&(j<24))||((j>25)&&(j<29))||((j>30)&&(j<34)))
{
//从配置文件中读取储存的信息
String pstr = preferences.getString(i+","+j, "");
if(pstr!="")
{
tv[i][j].setText(pstr);
tv[i][j].setTextColor(0xff000000);
tv[i][j].setTextSize(15);
}
else
{
tv[i][j].setText("点击添加");
tv[i][j].setTextColor(0xffdcdcdc);
tv[i][j].setTextSize(10);
}
//响应触摸事件
tv[i][j].setOnTouchListener(tl);
//响应click事件
tv[i][j].setOnClickListener(cl);
}
else
{
tv[i][j].setText(constr[constrid]);
tv[i][j].setTextColor(0xff000000);
tv[i][j].setTextSize(15);
constrid++;
}
}
}
}
public int gettab(String tab) {
if(tab=="tab1")
return 0;
else if(tab=="tab2")
return 1;
else if(tab=="tab3")
return 2;
else if(tab=="tab4")
return 3;
else if(tab=="tab5")
return 4;
return -1;
}
public int temptab,tempposition;
public EditText TextEntry;
public View createTabContent(String tab) {
grid = new GridView(this);
grid.setNumColumns(5);
grid.setBackgroundColor(0xffDCDCDC);
grid.setHorizontalSpacing(1);
grid.setVerticalSpacing(1);
temptab = gettab(tab);
grid.setAdapter(new TextAdapter());
AnalogClock dc = new AnalogClock(this);
dc.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
//创建线性布局
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.setHorizontalGravity(Gravity.CENTER);
ll.addView(grid);
ll.addView(dc);
return ll;
}
//自定义配适器
public class TextAdapter extends BaseAdapter {
public TextAdapter() {
}
public int getCount() {
return 35;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
return tv[temptab][position];
}
}
public TextView[][] tv;
public String[] constr = {
"节次", "课程名称", "周次", "上课地点", "上课时间",
"第一大节", "8:30-10:05",
"第二大节", "10:25-12:00",
"第三大节", "13:50-15:25",
"第四大节", "15:45-17:20",
"第五大节", "18:20-19:55",
"第六大节", "20:00-20:45"
};
}
源码下载: http://dl.vmall.com/c03wzyimgy