android项目总结
以下各个包,并总结下学习过的东西(主要是怕忘了):
com.joker
com.joker.action
com.joker.adapter
com.joker.graphs
com.joker.info
com.joker.model
com.joker.myview
com.joker.net
com.joker.splash
com.joker.thread
com.joker.utils
com.joker
主体包,view层,主体界面层
JokerMainActivity
这个部分主要工作是初始化主界面的各个模块部分,包括界面顶端栏目切换部分,4个栏目的fragment初始化,菜单部分各个按钮的监听,各个栏目切换的按钮监听,根据不同用户角色显示不同的菜单选项判断,初始化朗读人声音效按钮列表,设置双击退出应用。其中,最主要的就是界面滑动部分,主要代码如下:
private FragmentViewPagerAdapter adapter;
// 分类栏和指示器
private JokerIndexContainer mTitleView;
// 此处设置子屏幕的初始化
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
mTitleView.mJokes1NewestTextView = (TextView) findViewById(R.id.id_tv_jokes_newest);
mTitleView.mJokes3WordTextView = (TextView) findViewById(R.id.id_tv_jokes_word);
mTitleView.mJokes2BestTextView = (TextView) findViewById(R.id.id_tv_jokes_best);
mTitleView.mJokes4AudioTextView = (TextView) findViewById(R.id.id_tv_jokes_audio);
// 将四个子页视图放入到数组中
mDatas = new ArrayList<Fragment>();
Jokes1NewestMainListFragment tab01 = new Jokes1NewestMainListFragment();
Jokes2BestMainListFragment tab02 = new Jokes2BestMainListFragment();
Jokes3WordMainListFragment tab03 = new Jokes3WordMainListFragment();
Jokes4AudioMainListFragment tab04 = new Jokes4AudioMainListFragment();
mDatas.add(tab01);
mDatas.add(tab02);
mDatas.add(tab03);
mDatas.add(tab04);
// 设置适配器
adapter = new FragmentViewPagerAdapter(mTitleView,this.getSupportFragmentManager(), mViewPager, mDatas);
JokerIndexContainer
如注释所说,把分类栏的内容抽取成一个类,方便消息传递,代码如下:
// @说明 把分类栏的内容抽取成一个类,使得内容便于传递
public class JokerIndexContainer {
public TextView mJokes1NewestTextView;// 分类栏“最新”文本视图
public TextView mJokes3WordTextView;// 分类栏“纯文”文本视图
public TextView mJokes2BestTextView;// 分类栏“最赞”文本视图
public TextView mJokes4AudioTextView;// 分类栏“语音”文本视图
public ImageView mTabline;
public int mScreen1_4;
JokerIndexContainer(Context ctx) {
mJokes1NewestTextView = new TextView(ctx);
mJokes3WordTextView = new TextView(ctx);
mJokes2BestTextView = new TextView(ctx);
mJokes4AudioTextView = new TextView(ctx);
mTabline = new ImageView(ctx);
}
}
Jokes1NewestMainListFragment(其中一个页面)
此示例页面就是主要显示最新的笑话的页面的一个fragment,类继承Fragment。
//动态加入listview
mLinearLayout = (LinearLayout)view.findViewById(R.id.HomeGroup);
myListView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
myListView.setDivider(null);
mLinearLayout.addView(myListView);
//这是网络连接的代码,安装规定好的格式传输,获取定量的笑话条数
url = Model.NEWJOKE;
ListBottem.setVisibility(View.GONE);
start = 0;
ThreadPoolUtils.execute(new HttpGetThread(hand,url+"?start="+start+"&num="+number));
start +=number;
loadflag = false;
//点击笑话后跳转到详情页
private OnItemClickListener listener =new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
JokeInfo jokeinfo = (JokeInfo)arg0.getAdapter().getItem(arg2);//Adapter中取出数据
if(!isnet.IsConnect()){
Toast.makeText(ctx, "请先连接网络", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(ctx, JokerSendCommentActivity.class);
Bundle bund = new Bundle();
bund.putSerializable("JokeInfo", list.get(arg2-1));
intent.putExtra("value", bund);
ctx.startActivity(intent);
}
};
com.joker.actions
事务层,包含用户各种操作逻辑
JokerAuthorityActivity
这个activity是用于Boss管理各个管理员的各式操作,比如同意用户的管理员申请,撤销用户管理员权限,主要代码如下:
private void adapter(int statu){
if (statu==0) {
//申请管理员界面设置
myAppleAdminAdapter = new MyApplyAdminAdapter(ctx, appleList);
listview.setAdapter(myAppleAdminAdapter);
show.setText("申请管理员");
ThreadPoolUtils.execute(new HttpGetThread(hand, Model.SHOWADMINLIST));
}else if(statu==1){
//撤销管理员界面设置
myCancleAdminAdapter = new MyCancleAdminAdapter(ctx, cancleList);
listview.setAdapter(myCancleAdminAdapter);
show.setText("撤销管理员");
ThreadPoolUtils.execute(new HttpGetThread(hand, Model.SHOWADMINLIST));
}
}
//上传管理员信息在adapter里的按钮监听里面,详见MyApplyAdminAdapter,MyCancleAdminAdapter
JokerCheckActivity
这个类主要处理审核用户发布的笑话的管理员操作,如审核笑话,通过与反对的功能:
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!isnet.IsConnect()){
Toast.makeText(JokerCheckActivity.this, "请先连接网络", Toast.LENGTH_SHORT).show();
return;
}
/*解释下这里为什么两次网络连接,因为到服务器修改用户管理员标志完的时候取数据发现还是把之前的用户信息取过来,数据操作需要时间,就用第二次来取,取除刚操作的用户数据以外的数据。*/
ThreadPoolUtils.execute(new HttpGetThread(show_handler, Model.CHECKJOKE+"?vid="+jokeid+"&act=pass&uid="+uid));
ThreadPoolUtils.execute(new HttpGetThread(show_handler, Model.CHECKSHOW+"?vid="+jokeid));
ok.setEnabled(false);
no.setEnabled(false);
}
});
//自己定义的showhandler(Handler类)里接收到none表示没有需要审核的笑话了
JokerContributeActivity
这个类主要负责用户投稿操作,里面涉及到一些上传图片,上传音频,录音,图片压缩等一些主要的功能。
// 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);
intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//设置intent使得在4.4及以上版本不出现图片选择器
startActivityForResult(intent, 1);
//录音的主要代码,这里还需要注意的问题是,按下录音后再反复点击会崩溃,需要无效按钮几秒防止用户过于频繁点击,也保证录音长度质量,太频繁的点击全都被忽略
time_start=System.currentTimeMillis();
Toast.makeText(JokerContributeActivity.this, "开始录音啦~", 1000).show();
filename = new Date().getTime() + ".amr";
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/" + filename);
//发布笑话部分,用规定好的json格式发送给服务器
int uid = Model.MYUSERINFO.getUserID();// 用户ID
String xvalue = neirongEdit.getText().toString();// 笑话内容
String ximg = "";// 笑话图片
String xradio = "";// 笑话音频
if (!img.equalsIgnoreCase("")) {
ximg = System.currentTimeMillis() + ".png";// 笑话图片
}
if (!radio.equalsIgnoreCase("")) {
xradio = System.currentTimeMillis() + ".war";