做了一年多的Android开发,开始积累了一点Android开发方面的经验。所以想抽点时间总结归纳一下。
基本上所有的程序员,都有一种对美的追求。代码所谓的美来自於抽象。要追求怎样的美,怎样的抽象,取决於:工作的现况,程序员的专业能力,性格与自我的要求。最重要的是,将代码适度的抽象,进而转化为知识的积累,那是一趟自我不断提升的美好旅程。
这个程序使用了github上的一个开源的sidebar框架,作者为:Julian Chu (a.k.a walkingice) walkingice0204@gmail.com
项目的目录结构如图,
MainActivity和AnimationLayout是sidebar的关键部分,
workerService是业务逻辑模块,毫无疑问MainActivity和两个Fragment就是视图模块。
这样设计的目的主要是为了让视图和业务逻辑分离,所有的业务逻辑都在Service中,当Service中
处理完业务后,通过Broadcast通知Activity和Fragment改变UI,而Activity调用业务逻辑则通过Intent来
实现。
代码明细
MainActivity
//初始化sidebar和Fragment组件
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(CHANGE_VIEW);
receiver = new ChangeViewReceiver();
registerReceiver(receiver, filter);
mLayout = (AnimationLayout) findViewById(R.id.animation_layout);
mLayout.setListener(this);
mList = (ListView) findViewById(R.id.sidebar_list);
mList.setAdapter(
new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_1
, mStrings));
final FragmentManager fm = getSupportFragmentManager();
mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
// TODO Auto-generated method stub
String name=(String)parent.getAdapter().getItem(position);
Log.i(TAG, "vlaue="+name+",position="+position+",id="+id);
FragmentTransaction ft=fm.beginTransaction();
Fragment main=fm.findFragmentByTag("main");
if(main!=null){
ft.remove(main);
}
ft.add(R.id.animation_layout_content, switchFragment(position), "main");
ft.commit();
mLayout.closeSidebar();
}
});
// mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
//MainActivity中的BroadcastReceiver,用来接收Service发送过来的事件,并改变UI
class ChangeViewReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
String action=intent.getAction();
Log.i("lcm", "ChangeViewReceiver,action="+action);
if(action!=null){
if(action.equals(CHANGE_VIEW)){
String msg=intent.getStringExtra("msg");
if(msg.equals("viewid")){
FragmentManager fm = getSupportFragmentManager();
Fragment ft=fm.findFragmentByTag("main");
//动态改变Fragment中控件的状态
LinearLayout viewRoot=(LinearLayout)ft.getView().findViewById(R.id.fragment_b_root);
EditText edit=(EditText)viewRoot.findViewById(R.id.editText1);
edit.setText("你好啊");
//或者也可以动态的添加控件
// LinearLayout child=new LinearLayout(getApplicationContext());
// child.setLayoutParams(LP_FW);
// child.setBackgroundResource(R.color.mybak);
// viewRoot.addView(child);
}else if(msg.equals("viewtag")){
}
}
}
}
}
HelloFragment
//定义一个接口让Activity来实现,就可以方便的调用Activity中的资源
public interface OnArticleSelectedListener{
public void onArticleSelected(String action);
}
WorkerService
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
// return super.onStartCommand(intent, flags, startId);
String action=intent.getAction();
Log.i("lcm", "action="+action);
if(action.equals(CHANGE)){
//在这里处理具体的业务逻辑,比如执行网络操作,磁盘操作或者数据库操作
//为了简单起见,这里直接向Activity发送改变UI的广播
sendBroadcast("viewid");
}
return START_STICKY;
}
完整的项目下载:
http://pan.baidu.com/share/link?shareid=3007225400&uk=1611114851
这个项目只是我的一点不成熟的想法,欢迎提出有用的建议,
关于为什么我没有提取出一个公共的Fragment的问题,那是因为我现在开发的那个程序,跟oschina的手机客户端业务相差很大,每个界面的UI几乎完全不同,不像oschina每个界面基本都是ListView。
来源:oschina
链接:https://my.oschina.net/u/246601/blog/150034