Saturday

MVC pattern in Android


This is an example of implementation MVC pattern in android development.

Calculator application

- MainActivity is the application execution, there is only CalculatorActivity, which is responsible for the GUI, event handling and display of visual objects.
- JModel: maintains state of the calculator.
- JView: display of model state, the state of the calculator.
- JController: receives user input via button onClick events, sends user input to Model, and sends "Model state" to myView.











Class JController:

package com.example.mvcpatternandroid;

import com.example.mvcpatternandroid.R;

import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;

/**
 * copyright (c) jbohn
 */
public class JController implements OnClickListener {

    JModel myModel = null;
    JView myView = null;

    public JController(final JModel myModel, final JView myView) 
    {
        this.myModel = myModel;
        this.myView = myView;
        this.myView.registerListener(this);
    }

    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.button0:
            myModel.setModel('0');
            break;
        case R.id.button1:
            myModel.setModel('1');
            break;
        case R.id.button2:
            myModel.setModel('2');
            break;
        case R.id.button3:
            myModel.setModel('3');
            break;
        case R.id.button4:
            myModel.setModel('4');
            break;
        case R.id.button5:
            myModel.setModel('5');
            break;
        case R.id.button6:
            myModel.setModel('6');
            break;
        case R.id.button7:
            myModel.setModel('7');
            break;
        case R.id.button8:
            myModel.setModel('8');
            break;
        case R.id.button9:
            myModel.setModel('9');
            break;
        case R.id.buttonPlus:
            myModel.setModel('+');
            break;
        case R.id.buttonDivide:
            myModel.setModel('/');
            break;
        case R.id.buttonMinus:
            myModel.setModel('-');
            break;
        case R.id.buttonTimes:
            myModel.setModel('*');
            break;
        case R.id.buttonC:
            myModel.setModel('C');
            break;
        case R.id.buttonEqual:
            myModel.setModel('=');
            break;
        }
        myView.setView(myModel.getModel());
    }
}
 
* Class JView 
 
package com.example.mvcpatternandroid;

import com.example.mvcpatternandroid.R;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;


/**
 * @author QuocTrinh
 * copyright (c) jbohn
 */
public class JView extends LinearLayout {
    private EditText txtDisplay;
    LayoutInflater layoutInflater;
    public JView(Activity activity) 
    {
        super(activity, null);
        
        this.setOrientation(VERTICAL);
        
        getInFlater(activity);
        
        getTxtView();
    }


    private void getInFlater(Activity activity) 
    {
        layoutInflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    
    private void getTxtView() {
        layoutInflater.inflate(R.layout.display, this);
        txtDisplay = (EditText) findViewById(R.id.editString);
    }

    public void setView(String s) {
        txtDisplay.setText(s);
    }
    
    public void registerListener(OnClickListener onClickListener) {
        
        View view = (View) layoutInflater.inflate(R.layout.keyboard, this);
        
        final Button button0 = (Button) view.findViewById(R.id.button0);
        final Button button1 = (Button) view.findViewById(R.id.button1);
        final Button button2 = (Button) view.findViewById(R.id.button2);
        final Button button3 = (Button) view.findViewById(R.id.button3);
        final Button button4 = (Button) view.findViewById(R.id.button4);
        final Button button5 = (Button) view.findViewById(R.id.button5);
        final Button button6 = (Button) view.findViewById(R.id.button6);
        final Button button7 = (Button) view.findViewById(R.id.button7);
        final Button button8 = (Button) view.findViewById(R.id.button8);
        final Button button9 = (Button) view.findViewById(R.id.button9);
        final Button buttonC = (Button) view.findViewById(R.id.buttonC);
        final Button buttonPlus = (Button) view.findViewById(R.id.buttonPlus);
        final Button buttonEqual = (Button) view.findViewById(R.id.buttonEqual);
        final Button buttonMinus = (Button) view.findViewById(R.id.buttonMinus);
        final Button buttonTimes = (Button) view.findViewById(R.id.buttonTimes);
        final Button buttonDivide = (Button) view
                .findViewById(R.id.buttonDivide);

        button0.setOnClickListener(onClickListener);
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
        button4.setOnClickListener(onClickListener);
        button5.setOnClickListener(onClickListener);
        button6.setOnClickListener(onClickListener);
        button7.setOnClickListener(onClickListener);
        button8.setOnClickListener(onClickListener);
        button9.setOnClickListener(onClickListener);
        buttonC.setOnClickListener(onClickListener);
        buttonPlus.setOnClickListener(onClickListener);
        buttonEqual.setOnClickListener(onClickListener);
        buttonMinus.setOnClickListener(onClickListener);
        buttonTimes.setOnClickListener(onClickListener);
        buttonDivide.setOnClickListener(onClickListener);
    }

} 

* Class JModel
package com.example.mvcpatternandroid;

/**
 * @author QuocTrinh
 * copyright (c) jbohn
 */
public class JModel {
    private double accumulator, opr;
    private char op;

    public JModel() {
        accumulator = 0.0;
    }

    public void setModel(char c) {
        switch (c) {
        case 'C':
            opr = 0.0;
            accumulator = 0.0;
            break;
        case '+':
            ;
        case '-':
            ;
        case '*':
            ;
        case '/':
            op = c;
            opr = accumulator;
            accumulator = 0.0;
            break;
        case '=':
            switch (op) {
            case '+':
                accumulator = opr + accumulator;
                break;
            case '-':
                accumulator = opr - accumulator;
                break;
            case '*':
                accumulator = opr * accumulator;
                break;
            case '/':
                accumulator = opr / accumulator;
                break;
            default:
            }
            break;
        default: // Assume '0'..'9' digit
            accumulator = accumulator * 10.0 + (c - '0');
            break;
        }
    }

    public String getModel() {
        return accumulator + "";
    }
}
 
Download Source code (http://jbohn.blogspot.com/)
 

2 comments:

  1. any chance of looking at the complete source for this MVC example?
    regards

    ReplyDelete
  2. this is download link: https://learn-java-together.googlecode.com/files/MVCPatternAndroid.7z


    Actually I posted source at the end of this entry, u can use a reader QR app to get it.

    BR

    ReplyDelete