Android MVC之個人實現

作了一年多的Android開發,開始積累了一點Android開發方面的經驗。因此想抽點時間總結概括一下。
基本上全部的程序員,都有一種對美的追求。代碼所謂的美來自於抽象。要追求怎樣的美,怎樣的抽象,取決於:工做的現況,程序員的專業能力,性格與自個人要求。最重要的是,將代碼適度的抽象,進而轉化爲知識的積累,那是一趟自我不斷提高的美好旅程。 java

這個程序使用了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來
實現。
android

代碼明細
MainActivity
git

//初始化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。
github

相關文章
相關標籤/搜索