【该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材】
【项目题目】:校园订餐App设计
综合案例
【目标】
主界面的功能确实比较复杂,因此上一篇知识说的周边内容。现在开始说这个界面的代码和布局文件。
1、先看一下项目的组织结构吧,要不然不好说他们的关系:
(1)db包中的都是跟 数据库相关的
(2)eatall中放的都是activity或者fragment
(3)entity中放的实体类
(4)util中放的是工具类
2、主界面activity类是MainActivity,注意它继承的是ActivityGroup,因为还没用使用Fragment
/**
* 百米购的主界面,内含一个TabHost,作为主导航使用
* @author Administrator
*/
public class MainActivity extends ActivityGroup {
TabHost tabHost;
GridView gv;
String mainMenus[]={"百米美食","百米餐馆","推荐美食","我的最爱",
"健康跟踪","美食心得","查看菜系","我的账单",
"提前预定","系统帮助","百米设置","注册信息"};
int mainMenuIcons[]=new int[12];
List<Map<String,Object>> menuData ;//Tab3中主菜单的 数据
EatApp app ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabHost=(TabHost) findViewById(R.id.mainTabHost);
//初始化导航界面
initTabHost();
app=(EatApp) getApplication();
}
//
private void initTabHost() {
tabHost.setup();//使用TabHost控件时,必须加入该程序
tabHost.setup(getLocalActivityManager());
TabSpec tab1=tabHost.newTabSpec("t1");
tab1.setIndicator("促销打折",getResources().getDrawable(R.drawable.logo_s) );
Intent intent1=new Intent(MainActivity.this,DiscountFoodActivity.class);
tab1.setContent(intent1);
TabSpec tab2=tabHost.newTabSpec("t2");
tab2.setIndicator("我的账单",getResources().getDrawable(R.drawable.logo_s) );
Intent intent2=new Intent(MainActivity.this,AccountActivity.class);
tab2.setContent(intent2);
TabSpec tab3=tabHost.newTabSpec("t3");
tab3.setIndicator("百米购",getResources().getDrawable(R.drawable.logo_s) );
tab3.setContent(R.id.main_tabMainFace);
tabHost.addTab(tab1);
tabHost.addTab(tab2);
tabHost.addTab(tab3);
//初始化Tab3的主导航页面
gv=(GridView) findViewById(R.id.main_tabMainFace_gv);
initGridView();
}
//对Tag3中的主导航GridView进行初始化
private void initGridView() {
for (int i = 0; i <mainMenuIcons.length; i++) {
mainMenuIcons[i]=R.drawable.mainmenu_01+i;
}
menuData=new ArrayList<Map<String,Object>>();
for (int i = 0; i < mainMenus.length; i++) {
Map<String,Object>item =new HashMap<String,Object>();
item.put("menuImg", mainMenuIcons[i]);
item.put("menuTitle", mainMenus[i]);
menuData.add(item);
}
SimpleAdapter sa =new SimpleAdapter(
this,
menuData,
R.layout.mainmenulist_item,
new String[]{"menuImg","menuTitle"},
new int[]{R.id.mainMenu_item_img,R.id.mainMenu_item_title}
);
gv.setAdapter(sa);
gv.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
}}
);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//菜单点击
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent=null ;
switch(item.getItemId()){
case R.id.menu_shopcat: //查看购物车菜单
intent =new Intent(MainActivity.this,ShopcartActivity.class);
break;
case R.id.menu_info: //查看个人信息
Log.i("Msg", app.userInfo+" 登录信息");
if(app.userInfo!=null){
intent =new Intent(MainActivity.this,UserinfoActivity.class);
}else{
new LoginDialog(this);
}
break;
case R.id.menu_setting: //系统设置菜单
break;
case R.id.menu_exit: //系统推出菜单
MainActivity.this.finish();
break;
}
if(intent!=null)
startActivity(intent);
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
if(app.userInfo!=null){
setTitle("百米购["+app.userInfo.getUserName()+"]");
}
}
/*退出时,情况购物车中的数据*/
@Override
protected void onDestroy() {
super.onDestroy();
EatApp app=(EatApp) getApplication();
app.orderItems.clear();
app.userInfo=null;
finish();
}
}
此处对几个方法的功能,进一步说明:
(1)
TabHost tabHost;
这个是底部的Tab导航要用的。
(2)下面这几个是 第三个Tab中要用的内容
GridView gv;
String mainMenus[]={"百米美食","百米餐馆","推荐美食","我的最爱",
"健康跟踪","美食心得","查看菜系","我的账单",
"提前预定","系统帮助","百米设置","注册信息"};
int mainMenuIcons[]=new int[12];
List<Map<String,Object>> menuData ;//Tab3中主菜单的 数据
(3)
EatApp app ;
这是自定义的一个Application类,目的是让不同的Activity可以共用一部分数据【后面还有说明的】
(4)代码中涉及到很多其他的Activity和类,先说明一下
DiscountFoodActivity.class :这个地方是 打折促销的 Activity界面
AccountActivity.class :这个是账单信息Activity界面
ShopcartActivity.class : 查看购物车菜单被点击,前往购物车Activity界面
UserinfoActivity.class :用户信息Activity界面
new LoginDialog(this) : 有一个自定义的对话框界面,实现用户登录
3、主界面的布局文件是:
<RelativeLayout 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"
tools:context=".MainActivity" >
<TabHost
android:id="@+id/mainTabHost"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" >
<LinearLayout
android:id="@+id/main_tabMainFace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<GridView android:id="@+id/main_tabMainFace_gv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="4"
android:padding="8dp"
android:gravity="center_horizontal"
></GridView>
</LinearLayout>
</FrameLayout>
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</TabWidget>
</LinearLayout>
</TabHost>
</RelativeLayout>
注意将TabWidget放在下面,以实现标签导航在下的方式。
4、上面用到一个GridView,它的元素采用的布局文件是:
<?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"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/mainMenu_item_img"
android:layout_width="80dp"
android:layout_height="80dp"
android:scaleType="centerCrop"
/>
<TextView
android:id="@+id/mainMenu_item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginTop="5dp"
android:text="菜单名"
/>
</LinearLayout>
结束,下一篇,说明主界面中的三个子界面是如果实现的。