android真实项目教程(七)——梦醒边缘花落_by_CJJ

作者通过一系列教程详细介绍了如何使用Android构建一个完整的App应用框架,从搭建基础框架到添加功能模块,如设置头像、实现滑动菜单等。教程涵盖了从概念到实践的全过程,包括使用ExpandableListView实现滑动菜单的填充,并提供了源码演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家下午好,我是CJJ,说说昨晚挑灯夜写毕业论文到凌晨三点多,当写到致谢词那块时,我违心的写下: 本论文在xxx导师的悉 心指导和亲切关怀下完成的。导师渊博的专业知识、严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严于律己、宽以待人的崇高风范,朴实无法、平易近人的人格魅力对本人影响深远。。。。。。”其实,我就只见了指导老师一面而已。。。。转回正题,写的这个app,就只剩下 SlideMenuFragment这块还没有任何东西 ,那么我们就填充它把。。。。
android真实项目教程(一)——App应用框架搭建_by_CJJ http://www.apkbus.com/forum.php?mod=viewthread&tid=166151
android真实项目教程(二)——漫画App初构_by_CJJ http://www.apkbus.com/forum.php?mod=viewthread&tid=166262
android真实项目教程(三)——首页初点缀_by_CJJ http://www.apkbus.com/forum.php?mod=viewthread&tid=166630
android真实项目教程(四)——MY APP MY STYLE_by_CJJ http://www.apkbus.com/forum.php?mod=viewthread&tid=167676
android真实项目教程(五)——有时三点两点雨_by_CJJ
http://www.apkbus.com/forum.php?mod=viewthread&tid=168422
android真实项目教程(六)——落叶醉赤壁_by_CJJ http://www.apkbus.com/android-168858-1-1.html
主要加入了两个功能:(1)设置头像,可以从相册选择,也可以相机拍摄;(2)ExpandableListView展开,item标明个功能模块。
效果如下图:



主要源码:
  1. <font size="4">package com.cjj.shopapp.fragment;


  2. import android.app.AlertDialog;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.graphics.Bitmap;
  6. import android.os.Bundle;
  7. import android.support.v4.app.Fragment;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.ViewGroup;
  12. import android.widget.ExpandableListView;
  13. import android.widget.ImageView;
  14. import android.widget.TextView;

  15. import com.cjj.shopapp.activity.R;
  16. import com.cjj.shopapp.adapter.ExpandableListViewSlideMenuAdapter;
  17. import com.cjj.shopapp.utils.ImageCropUtils;

  18. public class SlideMenuFragment extends Fragment implements OnClickListener {
  19. private ImageView img_head;
  20. private TextView tv_title;
  21. private AlertDialog headDialog;
  22. private ImageCropUtils cropUtils;
  23. private static final int OPEN_CAMERA = 0x101;
  24. private static final int CUT_CAMERA_RESULT = 0x102;
  25. private static final int CUT_GALLERY_RESULT = 0x103;
  26. private Bitmap bitmap;
  27. private ExpandableListView expandableListView;
  28. private ExpandableListViewSlideMenuAdapter adapter;
  29. private TextView tv_exit;

  30. @Override
  31. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  32. Bundle savedInstanceState) {
  33. View v = inflater.inflate(R.layout.fragment_slide_menu, null);
  34. return v;
  35. }

  36. @Override
  37. public void onActivityCreated(Bundle savedInstanceState) {
  38. super.onActivityCreated(savedInstanceState);
  39. adapter = new ExpandableListViewSlideMenuAdapter();
  40. expandableListView.setAdapter(adapter);
  41. expandableListView.setGroupIndicator(null);
  42. int groupCount = expandableListView.getCount();

  43. for (int i = 0; i < groupCount; i++) {
  44. expandableListView.expandGroup(i);
  45. }
  46. }

  47. @Override
  48. public void onCreate(Bundle savedInstanceState) {
  49. super.onCreate(savedInstanceState);
  50. }

  51. @Override
  52. public void onDestroyView() {
  53. img_head = null;
  54. tv_title = null;
  55. headDialog = null;
  56. cropUtils = null;
  57. bitmap = null;
  58. super.onDestroyView();
  59. }

  60. @Override
  61. public void onViewCreated(View view, Bundle savedInstanceState) {
  62. super.onViewCreated(view, savedInstanceState);
  63. expandableListView = (ExpandableListView) view
  64. .findViewById(R.id.elv_slide_menu);
  65. img_head = (ImageView) view.findViewById(R.id.img_head);
  66. tv_title = (TextView) view.findViewById(R.id.tv_title);
  67. tv_exit = (TextView) view.findViewById(R.id.tv_exit);
  68. tv_exit.setOnClickListener(this);
  69. tv_title.setOnClickListener(this);
  70. img_head.setOnClickListener(this);
  71. initAlertUserHeadDialog();
  72. cropUtils = new ImageCropUtils(getActivity());
  73. }

  74. @Override
  75. public void onClick(View v) {
  76. switch (v.getId()) {
  77. case R.id.img_head:
  78. case R.id.tv_title:
  79. headDialog.show();
  80. break;
  81. case R.id.tv_exit:
  82. System.exit(0);
  83. break;
  84. }
  85. }


  86. /**
  87. * 显示修改公会头像的对话框
  88. */
  89. private String[] photoItems = new String[] { "相册", "拍照" };

  90. private void initAlertUserHeadDialog() {
  91. headDialog = new AlertDialog.Builder(getActivity()).setTitle("修改头像")
  92. .setItems(photoItems, new DialogInterface.OnClickListener() {
  93. @Override
  94. public void onClick(DialogInterface dialog, int which) {

  95. dialog.dismiss();

  96. switch (which) {
  97. case 0: // 相册
  98. cropUtils
  99. .openGalleryAndCropSmallPhoto(CUT_GALLERY_RESULT);
  100. break;

  101. case 1: // 拍照

  102. cropUtils.openCamera(OPEN_CAMERA);
  103. break;
  104. }
  105. }
  106. }).create();
  107. }

  108. @Override
  109. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  110. switch (requestCode) {
  111. case OPEN_CAMERA:// 从相机

  112. cropUtils.cropBigPhotoByCamera(CUT_CAMERA_RESULT);

  113. break;

  114. case CUT_CAMERA_RESULT:// 返回记过

  115. bitmap = cropUtils.getBitmapByUri();
  116. img_head.setImageBitmap(bitmap);

  117. break;

  118. case CUT_GALLERY_RESULT:

  119. if (data != null) {
  120. bitmap = cropUtils.getBitmapByIntent(data);
  121. img_head.setImageBitmap(bitmap);
  122. }

  123. break;
  124. }

  125. super.onActivityResult(requestCode, resultCode, data);
  126. }

  127. }</font>
复制代码
  1. package com.cjj.shopapp.fragment;


  2. import android.app.AlertDialog;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.graphics.Bitmap;
  6. import android.os.Bundle;
  7. import android.support.v4.app.Fragment;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.ViewGroup;
  12. import android.widget.ExpandableListView;
  13. import android.widget.ImageView;
  14. import android.widget.TextView;

  15. import com.cjj.shopapp.activity.R;
  16. import com.cjj.shopapp.adapter.ExpandableListViewSlideMenuAdapter;
  17. import com.cjj.shopapp.utils.ImageCropUtils;

  18. public class SlideMenuFragment extends Fragment implements OnClickListener {
  19. private ImageView img_head;
  20. private TextView tv_title;
  21. private AlertDialog headDialog;
  22. private ImageCropUtils cropUtils;
  23. private static final int OPEN_CAMERA = 0x101;
  24. private static final int CUT_CAMERA_RESULT = 0x102;
  25. private static final int CUT_GALLERY_RESULT = 0x103;
  26. private Bitmap bitmap;
  27. private ExpandableListView expandableListView;
  28. private ExpandableListViewSlideMenuAdapter adapter;
  29. private TextView tv_exit;

  30. @Override
  31. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  32. Bundle savedInstanceState) {
  33. View v = inflater.inflate(R.layout.fragment_slide_menu, null);
  34. return v;
  35. }

  36. @Override
  37. public void onActivityCreated(Bundle savedInstanceState) {
  38. super.onActivityCreated(savedInstanceState);
  39. adapter = new ExpandableListViewSlideMenuAdapter();
  40. expandableListView.setAdapter(adapter);
  41. expandableListView.setGroupIndicator(null);
  42. int groupCount = expandableListView.getCount();

  43. for (int i = 0; i < groupCount; i++) {
  44. expandableListView.expandGroup(i);
  45. }
  46. }

  47. @Override
  48. public void onCreate(Bundle savedInstanceState) {
  49. super.onCreate(savedInstanceState);
  50. }

  51. @Override
  52. public void onDestroyView() {
  53. img_head = null;
  54. tv_title = null;
  55. headDialog = null;
  56. cropUtils = null;
  57. bitmap = null;
  58. super.onDestroyView();
  59. }

  60. @Override
  61. public void onViewCreated(View view, Bundle savedInstanceState) {
  62. super.onViewCreated(view, savedInstanceState);
  63. expandableListView = (ExpandableListView) view
  64. .findViewById(R.id.elv_slide_menu);
  65. img_head = (ImageView) view.findViewById(R.id.img_head);
  66. tv_title = (TextView) view.findViewById(R.id.tv_title);
  67. tv_exit = (TextView) view.findViewById(R.id.tv_exit);
  68. tv_exit.setOnClickListener(this);
  69. tv_title.setOnClickListener(this);
  70. img_head.setOnClickListener(this);
  71. initAlertUserHeadDialog();
  72. cropUtils = new ImageCropUtils(getActivity());
  73. }

  74. @Override
  75. public void onClick(View v) {
  76. switch (v.getId()) {
  77. case R.id.img_head:
  78. case R.id.tv_title:
  79. headDialog.show();
  80. break;
  81. case R.id.tv_exit:
  82. System.exit(0);
  83. break;
  84. }
  85. }


  86. /**
  87. * 显示修改公会头像的对话框
  88. */
  89. private String[] photoItems = new String[] { "相册", "拍照" };

  90. private void initAlertUserHeadDialog() {
  91. headDialog = new AlertDialog.Builder(getActivity()).setTitle("修改头像")
  92. .setItems(photoItems, new DialogInterface.OnClickListener() {
  93. @Override
  94. public void onClick(DialogInterface dialog, int which) {

  95. dialog.dismiss();

  96. switch (which) {
  97. case 0: // 相册
  98. cropUtils
  99. .openGalleryAndCropSmallPhoto(CUT_GALLERY_RESULT);
  100. break;

  101. case 1: // 拍照

  102. cropUtils.openCamera(OPEN_CAMERA);
  103. break;
  104. }
  105. }
  106. }).create();
  107. }

  108. @Override
  109. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  110. switch (requestCode) {
  111. case OPEN_CAMERA:// 从相机

  112. cropUtils.cropBigPhotoByCamera(CUT_CAMERA_RESULT);

  113. break;

  114. case CUT_CAMERA_RESULT:// 返回记过

  115. bitmap = cropUtils.getBitmapByUri();
  116. img_head.setImageBitmap(bitmap);

  117. break;

  118. case CUT_GALLERY_RESULT:

  119. if (data != null) {
  120. bitmap = cropUtils.getBitmapByIntent(data);
  121. img_head.setImageBitmap(bitmap);
  122. }

  123. break;
  124. }

  125. super.onActivityResult(requestCode, resultCode, data);
  126. }

  127. }
复制代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/navigation_background"
  6. android:orientation="vertical" >

  7. <include layout="@layout/ab_slide_menu" />

  8. <View
  9. android:id="@+id/ab_top_line"
  10. android:layout_width="match_parent"
  11. android:layout_height="2.0px"
  12. android:background="@drawable/menu_divid_line" />

  13. <ExpandableListView
  14. android:id="@+id/elv_slide_menu"
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:layout_weight="1"
  18. android:cacheColorHint="@android:color/transparent"
  19. android:divider="@android:color/transparent"
  20. android:fadingEdge="none"
  21. android:listSelector="@android:color/transparent"
  22. android:scrollbars="none" />

  23. <View
  24. android:id="@+id/ab_bottom_line"
  25. android:layout_width="match_parent"
  26. android:layout_height="1.0px"
  27. android:layout_above="@+id/ab_bottom"
  28. android:background="#ff3d3d3d" />

  29. <include layout="@layout/item_menu_slide" />

  30. </LinearLayout>
复制代码
  1. package com.cjj.shopapp.adapter;

  2. import android.content.Context;
  3. import android.graphics.drawable.Drawable;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.ViewGroup;
  8. import android.widget.BaseExpandableListAdapter;
  9. import android.widget.TextView;
  10. import android.widget.Toast;

  11. import com.cjj.shopapp.activity.MainActivity;
  12. import com.cjj.shopapp.activity.R;
  13. import com.cjj.shopapp.fragment.AboutFragment;
  14. import com.cjj.shopapp.fragment.CategoryFragment;
  15. import com.cjj.shopapp.fragment.HotFragment;

  16. public class ExpandableListViewSlideMenuAdapter extends
  17. BaseExpandableListAdapter implements OnClickListener {
  18. private Context mContext;
  19. private MainActivity mGroupActivity;
  20. private static final String[] title = new String[] { "功能", "其他" };
  21. private static final String[][] msg = new String[][] {
  22. { "主界面", "分类", "热门", "关于" }, { "分享", "反馈", "更多" } };

  23. private static final int[][] icon = new int[][] {
  24. { R.drawable.menu_home, R.drawable.slide_allgoods,
  25. R.drawable.menu_shop_order, R.drawable.menu_enter_order },
  26. {R.drawable.menu_message, R.drawable.menu_aler_user_info,
  27. R.drawable.menu_shop_commend, } };

  28. @Override
  29. public int getGroupCount() {
  30. return title.length;
  31. }

  32. @Override
  33. public int getChildrenCount(int groupPosition) {
  34. return msg[groupPosition].length;
  35. }

  36. @Override
  37. public String getGroup(int groupPosition) {
  38. // TODO Auto-generated method stub
  39. return title[groupPosition];
  40. }

  41. @Override
  42. public String getChild(int groupPosition, int childPosition) {
  43. // TODO Auto-generated method stub
  44. return msg[groupPosition][childPosition];
  45. }

  46. @Override
  47. public long getGroupId(int groupPosition) {
  48. // TODO Auto-generated method stub
  49. return 0;
  50. }

  51. @Override
  52. public long getChildId(int groupPosition, int childPosition) {
  53. // TODO Auto-generated method stub
  54. return 0;
  55. }

  56. @Override
  57. public boolean hasStableIds() {
  58. // TODO Auto-generated method stub
  59. return false;
  60. }

  61. @Override
  62. public View getGroupView(int groupPosition, boolean isExpanded,
  63. View convertView, ViewGroup parent) {

  64. mContext = parent.getContext();
  65. mGroupActivity = (MainActivity) mContext;

  66. if (convertView == null) {
  67. convertView = LayoutInflater.from(parent.getContext()).inflate(
  68. R.layout.item_elv_slide_menu_group, null);
  69. mGroupHolder = new GroupHolder();
  70. mGroupHolder.tv_menuGroup = (TextView) convertView
  71. .findViewById(R.id.tv_menuGroup);
  72. mGroupHolder.ab_top_line = convertView
  73. .findViewById(R.id.ab_top_line);
  74. convertView.setTag(mGroupHolder);
  75. } else {
  76. mGroupHolder = (GroupHolder) convertView.getTag();
  77. }

  78. String groupName = getGroup(groupPosition);
  79. mGroupHolder.tv_menuGroup.setText(groupName);

  80. return convertView;
  81. }

  82. @Override
  83. public View getChildView(int groupPosition, int childPosition,
  84. boolean isLastChild, View convertView, ViewGroup parent) {
  85. if (convertView == null) {
  86. convertView = LayoutInflater.from(parent.getContext()).inflate(
  87. R.layout.item_elv_slide_menu_child, null);
  88. mChildHolder = new ChildHolder();
  89. mChildHolder.tv_menuChild = (TextView) convertView
  90. .findViewById(R.id.tv_menuChild);
  91. mChildHolder.ab_top_line = convertView
  92. .findViewById(R.id.ab_top_line);
  93. convertView.setTag(mChildHolder);
  94. } else {
  95. mChildHolder = (ChildHolder) convertView.getTag();
  96. }

  97. String childName = getChild(groupPosition, childPosition);

  98. mChildHolder.tv_menuChild.setText(childName);
  99. drawLeftByTextView(mChildHolder.tv_menuChild,
  100. icon[groupPosition][childPosition]);
  101. mChildHolder.tv_menuChild.setTag(groupPosition + "," + childPosition);
  102. mChildHolder.tv_menuChild.setOnClickListener(this);

  103. return convertView;
  104. }

  105. private void drawLeftByTextView(TextView mTextView, int resource) {
  106. Drawable mDrawable = mContext.getResources().getDrawable(resource);
  107. mDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth(),
  108. mDrawable.getIntrinsicHeight());
  109. mTextView.setCompoundDrawables(mDrawable, null, null, null);
  110. }

  111. @Override
  112. public boolean isChildSelectable(int groupPosition, int childPosition) {
  113. // TODO Auto-generated method stub
  114. return false;
  115. }

  116. private class GroupHolder {
  117. private TextView tv_menuGroup;
  118. private View ab_top_line;
  119. }

  120. private class ChildHolder {
  121. private TextView tv_menuChild;
  122. private View ab_top_line;
  123. }

  124. private GroupHolder mGroupHolder;
  125. private ChildHolder mChildHolder;

  126. @Override
  127. public void onClick(View v) {

  128. String tag = v.getTag().toString();
  129. String[] strTag = tag.split(",");
  130. int childPosition = Integer.parseInt(strTag[1].toString());
  131. int groupPosition = Integer.parseInt(strTag[0].toString());

  132. if (groupPosition == 0) {
  133. if (childPosition == 0) {
  134. mGroupActivity.switchNewFragment(mGroupActivity
  135. .createNewHomeFragment());
  136. } else if (childPosition == 1) {
  137. mGroupActivity.switchNewFragment(new CategoryFragment());
  138. } else if (childPosition == 2) {
  139. mGroupActivity.switchNewFragment(new HotFragment());
  140. } else if (childPosition == 3) {
  141. mGroupActivity.switchNewFragment(new AboutFragment());
  142. }
  143. } else {
  144. if (childPosition == 0) {
  145. Toast.makeText(mContext, "待开发", 1000).show();
  146. } else if (childPosition == 1) {
  147. Toast.makeText(mContext, "待开发", 1000).show();
  148. } else if (childPosition == 2) {
  149. Toast.makeText(mContext, "待开发", 1000).show();
  150. }
  151. }

  152. }

  153. }
复制代码

没多少东西,你看看源码就能知道它怎么实现的了。呵呵。。。如果可以,我们一起加油把。。。。
源码:
本帖隐藏的内容
由于文件过大,库包没有传上来: v_7.rar(13.38 MB, 下载次数: 30)
cdsn有我上传的完整版: http://download.youkuaiyun.com/detail/junjichen/7297495



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值