Androidプログラミング日記 (仮)  

メモ帳

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

 

 

 

メモ帳

コードいぢりの方でも書いたのですが、一つ作りたいアプリがあるのですが、ちょっと大規模な感じになりそうなので段階ほふんで作成していこうかなと思い、まずは部品コードの勉強、次に簡単なアプリ。今回はこの段階になります。

考えがあまかったです。こういうのを実装したい、あーしたいこーしたい・・とやっていくと、勉強したことの応用なコードになり時間がかかりました。しかし、明確な仕様とイメージと勉強が効いて、最初にイメージしたものがすべて実装されてうまく動いてくれて満足です。

 

 

使用画像

メモ帳 仕様

新規保存、メモのリスト表示、リスト表示から選択で編集観覧、編集観覧から編集、消去。

保存はSDカードへ保存します。デバイスのSDカードのMemoTyouフォルダに4つファイルが作成されます。

たいした機能もないのに結構大きなコードになってしまいました。

MemoActivityの内容がすべてです。他のファイルは、コードいぢりで勉強したものがそのまま使われています。

今回新たに使用したコードもありますが、コードいぢりで勉強した応用なのでそちらも参考にして下さい。

ファイル名「main.xml」

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <and.roid.memo.Memo1View
    android:id="@+id/mainView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />


</LinearLayout>
						

ファイル名「inputmemo.xml」

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" android:layout_gravity="right|center_vertical">

    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    <TextView
        android:text="現在日時:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <TextView
        android:id="@+id/text_day"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    </TableRow>
    <TextView
        android:text="タイトルを入力して下さい"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <EditText
        android:id="@+id/text_title"
        android:hint="@string/dai_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:text="メモ内容を入力して下さい"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <EditText
        android:id="@+id/text_naiyou"
        android:hint="@string/dai_naiyou"
        android:layout_width="fill_parent"
        android:layout_height="200dp"/>

     <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    <Button
        android:id="@+id/save"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
		android:text="@string/btn_save"/>
    <Button
        android:id="@+id/buck"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
		android:text="@string/btn_buck"/>
    </TableRow>

</TableLayout>
						

ファイル名「listviewmemo.xml」

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
>
<TextView
  android:id="@+id/text_day"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1"
  android:textSize="20sp"
  android:padding="10dip"
/>
<TextView
  android:id="@+id/text_title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1"
  android:textSize="20sp"
  android:padding="10dip"
/>
</LinearLayout>
						

ファイル名「hensyuu.xml」

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" android:layout_gravity="right|center_vertical">

    <TextView
        android:id="@+id/hensyu_text_day"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
     <TextView
        android:text="に作成されたメモを編集します"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

    <TextView
        android:text="タイトル"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <EditText
        android:id="@+id/hensyu_text_title"
        android:hint="@string/dai_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:text="メモの内容"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <EditText
        android:id="@+id/hensyu_text_naiyou"
        android:hint="@string/dai_naiyou"
        android:layout_width="fill_parent"
        android:layout_height="200dp"/>

     <TableRow
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    <Button
        android:id="@+id/save2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
		android:text="@string/btn_save2"/>
    <Button
        android:id="@+id/del"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
		android:text="@string/btn_del"/>
    </TableRow>
    <Button
        android:id="@+id/buck2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
		android:text="@string/btn_buck2"/>

</TableLayout>
						

ファイル名「Strings.xml」

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, MemoActivity!</string>
    <string name="app_name">Memo</string>
    <string name="dai_dai">現在日時:</string>
    <string name="dai_title">タイトル:必須</string>
    <string name="dai_naiyou">内容:必須</string>
    <string name="btn_save">保存</string>
    <string name="btn_buck">戻る</string>
    <string name="btn_del">このメモを消去</string>
    <string name="btn_save2">このメモを保存</string>
    <string name="btn_buck2">何もせず戻る</string>

</resources>
						

ファイル名「MemoActivity.java」

/*
 * このアプリの中心クラス
 * このクラスは最初にmain.xmlのレイアウトを呼び出します
 * main.xmlのレイアウトはMemoView1のクラスを呼び出すよう
 * にしています。
 * 最初の画面
 * メモの新規作成画面
 * 書いたメモの選択リストビュー画面
 * リストビューで選択されたメモを編集観覧する画面
 * の4つの画面で構成されています
 *
 * SDカードに保存するようにしています
 * 日付、タイトル、内容、メモの数の4つのファイルが
 * 自動的に作成されます
 */

package and.roid.memo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.StringTokenizer;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Environment;
import android.text.Editable;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MemoActivity extends Activity{
	//SDカードに保存させるファイルのパス
	static private final String	DAY_FILE_PATH = "day.txt";
	private String day_text = "";
	static private final String TITLE_FILE_PATH = "title.txt";
	private String title_text = "";
	static private final String NAIYOU_FILE_PATH = "naiyou.txt";
	private String naiyou_text = "";
	static private final String KAZU_FILE_PATH = "kazu.txt";
	private int objkazu=0;
	//アプリで使用するList型の変数
	private List<MemoObject> memos = new ArrayList<MemoObject>();
	public List<String> tday = new ArrayList<String>();
	public List<String> ttitle = new ArrayList<String>();
	public List<String> tnaiyou = new ArrayList<String>();
	public float disp_w,disp_h;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
  		Window window = getWindow();
  		window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  		WindowManager manager = window.getWindowManager();
  		Display disp = manager.getDefaultDisplay();
  		disp_w = disp.getWidth();
  		disp_h = disp.getHeight();

  		try {
			FileRead();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		setContentView(R.layout.main);

    }
    //初期化
    public void init(){
    	day_text = "";
    	title_text = "";
    	naiyou_text = "";
    	objkazu=0;
    	memos.clear();
    	tday.clear();
    	ttitle.clear();
    	tnaiyou.clear();
    }

    //ファイルの中のStringの固まりを分解する処理
    public List<String> bunkaiMemo(String str){
    	StringTokenizer st = new StringTokenizer(str,",");
    	List <String> obj = new ArrayList<String>();
    	while(st.hasMoreTokens()){
    			obj.add(st.nextToken());
    	}
    	return obj;
    }

    //ファイルの中身を取り出しList型のMemoObjectとして入れる処理
    public void FileRead()throws IOException{

    	day_text = readText(DAY_FILE_PATH);
    	tday = bunkaiMemo(day_text);

    	title_text = readText(TITLE_FILE_PATH);
    	ttitle = bunkaiMemo(title_text);

    	naiyou_text = readText(NAIYOU_FILE_PATH);
    	tnaiyou = bunkaiMemo(naiyou_text);

    	objkazu = Integer.parseInt(readText(KAZU_FILE_PATH));

    	for(int i=0;i<objkazu;i++){
    		memos.add(new MemoObject(tday.get(i),ttitle.get(i),tnaiyou.get(i)));
    	}
    }

    //読み込みメソッド
	public String readText(String FILE_PATH) throws IOException{
		String SDFile = Environment.getExternalStorageDirectory() + "/MemoTyou/"+FILE_PATH;
		File file = new File(SDFile);

	    BufferedReader reader= new BufferedReader(new FileReader(file));
	    StringBuffer sb = new StringBuffer();
	    String sbs;
	    while ((sbs = reader.readLine()) != null) {
	        sb.append(sbs);
	    }
	    reader.close();
		return sb.toString();
	}

	//書き込みメソッド
	public void saveText(String FILE_PATH,String text,int mode) throws IOException {

		String SDFile = Environment.getExternalStorageDirectory() + "/MemoTyou/"+FILE_PATH;
        File file = new File(SDFile);
        file.getParentFile().mkdir();

        FileOutputStream fos = this.openFileOutput(FILE_PATH,mode);
        fos = new FileOutputStream(file, true);
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(text);
        bw.flush();
        bw.close();
	}

	public List<MemoObject> getAllMemo(){return memos;}
	public int getMemokazu(){return objkazu;}

	//メモ作成時に呼ばれる場所
	//レイアウトはinputmemo.xml
	public void setnewMemoLayout(){
		//ここでレイアウト切り替え
		setContentView(R.layout.inputmemo);

		TextView text_day = (TextView)this.findViewById(R.id.text_day);
		text_day.setText(getDay());

		//表示ボタンの処理inputmemo.xmlではボタン2つ

		//戻るボタン処理
		Button input_btn_buck = (Button)this.findViewById(R.id.buck);
  		input_btn_buck.setOnClickListener(new OnClickListener(){
             public void onClick(View v) {

	            	 init();
	                 try {
						FileRead();
					} catch (IOException e) {
						// TODO 自動生成された catch ブロック
						e.printStackTrace();
					}

	            	 setContentView(R.layout.main);

             }
         });

  		//保存ボタン処理
  		Button input_btn_save = (Button)this.findViewById(R.id.save);
  		input_btn_save.setOnClickListener(new OnClickListener(){

  			//タイトルか内容どちらかが空内容なら注意表示
	        public void onClick(View v) {
	        if(getEditNaiyou(R.id.text_title).length() == 0 ||
	          	   	 getEditNaiyou(R.id.text_naiyou).length() == 0){
	            		 makeTost("空入力はダメです");
	            	 }else{
			             setnewMemo();
			           	 init();
			           	 try {
			 				FileRead();
			 			} catch (IOException e) {
			 				// TODO 自動生成された catch ブロック
								e.printStackTrace();
		 				}

		 				setContentView(R.layout.main);

		             }
	             }

  			});
	}

	public String getEditNaiyou(int pas){
		EditText geb = (EditText)this.findViewById(pas);
		Editable et = geb.getText();
		return et.toString();
	}
	//新規作成メモを保存させた時の処理
	public void setnewMemo(){

		try {
			saveText(DAY_FILE_PATH,getDay()+",",MODE_APPEND);

			saveText(TITLE_FILE_PATH,getEditNaiyou(R.id.text_title)+",",MODE_APPEND);

			saveText(NAIYOU_FILE_PATH,getEditNaiyou(R.id.text_naiyou)+",",MODE_APPEND);

			++objkazu;
			DelFile("kazu.txt");
			String SDFile = Environment.getExternalStorageDirectory() + "/MemoTyou/"+"kazu.txt";
	        File file = new File(SDFile);
	        file.getParentFile().mkdir();
			saveText(KAZU_FILE_PATH,String.format("%d",objkazu),MODE_APPEND);

			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"メモを保存しました", Toast.LENGTH_LONG);

    		toast.show();
		} catch (IOException e) {
			e.printStackTrace();
			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"保存失敗;;", Toast.LENGTH_LONG);
    		toast.show();
		}
	}

	//観覧、編集を呼ばれたらここのレイアウトに移動
	//リストビュー自体はxmlではなく直接書いています
	public void setsubListView(){

		ListView lv = new ListView(this);
		setContentView(lv);
		lv.setAdapter(new ListAdapter(this, memos));

		//リストビューでアイテムを選択したときの処理
		//編集画面に移動します
		//レイアウトはhensyuu.xmlで設定されます
		lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	        	   //ここでレイアウト切り替え
	        	   setContentView(R.layout.hensyuu);

	        	   MemoObject hobj = memos.get(position);

	        	   TextView day = (TextView)findViewById(R.id.hensyu_text_day);
	        	   day.setText(hobj.getDay());

	        	   EditText title = (EditText)findViewById(R.id.hensyu_text_title);
	        	   title.setText(hobj.getTitle());

	        	   EditText naiyou = (EditText)findViewById(R.id.hensyu_text_naiyou);
	        	   naiyou.setText(hobj.getMemo());

	        	   setHensyuView(position);

	        	}
	     });

	}

	//編集画面のボタンクリック処理
	//ボタンは3つ
	public void setHensyuView(final int position){
		//保存ボタン処理
		Button input_btn_save = (Button)this.findViewById(R.id.save2);
 		input_btn_save.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
            	hensyuuSave(position);
            	init();
              	 try {
   					FileRead();
   				} catch (IOException e) {
   					// TODO 自動生成された catch ブロック
   					e.printStackTrace();
   				}
   				//ここでレイアウト切り替え
   				setContentView(R.layout.main);
            }
        });
 		//消去処理
 		Button input_btn_del = (Button)this.findViewById(R.id.del);
 		input_btn_del.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
            	memos.remove(position);
            	hensyuuDel();
            	init();
           	 try {
					FileRead();
				} catch (IOException e) {
					// TODO 自動生成された catch ブロック
					e.printStackTrace();
				}
				//ここでレイアウト切り替え
				setContentView(R.layout.main);
            }
        });
 		//戻る処理
 		Button input_btn_buck = (Button)this.findViewById(R.id.buck2);
 		input_btn_buck.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
            	 init();
            	 try {
 					FileRead();
 				} catch (IOException e) {
 					// TODO 自動生成された catch ブロック
 					e.printStackTrace();
 				}
 				//ここでレイアウト切り替え
 				setContentView(R.layout.main);
            }
        });
	}
	/*
	 * 編集画面で保存ボタンが押された時の処理
	 * 編集画面での保存ボタンも消去ボタンも
	 * 同じような処理になっています。
	 * 一度、ファイル自体をすべて消去して新たに
	 * アプリで保持しているデータをファイル作成
	 * とともに保存します。
	 */
	public void hensyuuSave(int position){

		Editable et;

 	   	EditText title = (EditText)this.findViewById(R.id.hensyu_text_title);
 	   	et = title.getText();
 	   	memos.get(position).setTitle(et.toString());

 	   	EditText naiyou = (EditText)this.findViewById(R.id.hensyu_text_naiyou);
 	   	et = naiyou.getText();
	   	memos.get(position).setMemo(et.toString());


		try {

			String SDFile;
			File file;

			DelFile("day.txt");
			DelFile("title.txt");
			DelFile("naiyou.txt");

			MakeFile("day.txt");
			MakeFile("title.txt");
			MakeFile("naiyou.txt");

			for(int i=0;i<objkazu;i++){
				saveText(DAY_FILE_PATH,memos.get(i).getDay()+",",MODE_APPEND);
				saveText(TITLE_FILE_PATH,memos.get(i).getTitle()+",",MODE_APPEND);
				saveText(NAIYOU_FILE_PATH,memos.get(i).getMemo()+",",MODE_APPEND);
			}

			DelFile("kazu.txt");
			MakeFile("kazu.txt");
			saveText(KAZU_FILE_PATH,String.format("%d",objkazu),MODE_APPEND);

			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"編集しました", Toast.LENGTH_LONG);

    		toast.show();
		} catch (IOException e) {
			e.printStackTrace();
			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"編集失敗;;", Toast.LENGTH_LONG);
    		toast.show();
		}
	}

	//編集画面で消去ボタンが押された時の処理
	//保存との違いはオブジェクトの数が-1されるとこだけです
	public void hensyuuDel(){
		try {
			--objkazu;

			String SDFile;
			File file;

			DelFile("day.txt");
			DelFile("title.txt");
			DelFile("naiyou.txt");

			MakeFile("day.txt");
			MakeFile("title.txt");
			MakeFile("naiyou.txt");

			for(int i=0;i<objkazu;i++){
				saveText(DAY_FILE_PATH,memos.get(i).getDay()+",",MODE_APPEND);
				saveText(TITLE_FILE_PATH,memos.get(i).getTitle()+",",MODE_APPEND);
				saveText(NAIYOU_FILE_PATH,memos.get(i).getMemo()+",",MODE_APPEND);
			}

			DelFile("kazu.txt");
			MakeFile("kazu.txt");
			saveText(KAZU_FILE_PATH,String.format("%d",objkazu),MODE_APPEND);

			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"消去しました", Toast.LENGTH_LONG);

    		toast.show();
		} catch (IOException e) {
			e.printStackTrace();
			Toast toast = Toast.makeText(this.getApplicationContext(),
    				"消去失敗;;", Toast.LENGTH_LONG);
    		toast.show();
		}
	}

	//ファイルを消去させる処理
	public void DelFile(String FILE_PATH){
		String SDFile = Environment.getExternalStorageDirectory() +"/MemoTyou/"+FILE_PATH;
		File file = new File(SDFile);
		file.delete();
	}

	//ファイルを作成させる処理
	public void MakeFile(String FILE_PATH){
		String SDFile = Environment.getExternalStorageDirectory() +"/MemoTyou/"+FILE_PATH;
		File file = new File(SDFile);
		file.getParentFile().mkdir();
	}

	//トースト表示をする処理
	public void makeTost(String str){
		Toast toast = Toast.makeText(this.getApplicationContext(),
				str, Toast.LENGTH_LONG);
		toast.show();
	}

	//日付日時を一つのStringオブジェクトで取り出します
	public String getDay(){
		Calendar cal = Calendar.getInstance();
		return (cal.get(Calendar.YEAR) + "/"+ (cal.get(Calendar.MONTH) + 1)
			+ "/" + cal.get(Calendar.DATE)+ " " + cal.get(Calendar.HOUR_OF_DAY) + ":"
	        + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND));}
}
						

ファイル名「Memo1View.java」


/*
 * main.xmlのレイアウトが呼び出されると
 * ここが呼び出されます。
 */

package and.roid.memo;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class Memo1View extends View{
	private MemoActivity memoAc;
	private Mesod mesod;
	private Rect btn1,btn2;
	private float disp_w,disp_h;
	private Drawable buck;
	private MemoObject obj = new MemoObject();

	public Memo1View(Context context) {
		super(context);
		initMemo(context);
	}
	public Memo1View(Context context, AttributeSet attrs) {
		super(context,attrs);
		initMemo(context);
	}
	public void initMemo(Context context){
		memoAc = (MemoActivity)context;
		mesod = new Mesod();
		disp_w = memoAc.disp_w;
		disp_h = memoAc.disp_h;
		btn1 = new Rect(60,217,60+50,217+50);
		btn2 = new Rect(359,274,359+50,274+50);
		Resources resources = context.getResources();
		Bitmap bimg = BitmapFactory.decodeResource(resources,R.drawable.buck1);
		buck = new BitmapDrawable(
				Bitmap.createBitmap(bimg,0,0,bimg.getWidth(),bimg.getHeight()));
		buck.setBounds(0, 0, mesod.setSizeX(disp_w, 480), mesod.setSizeY(disp_h, 854));

		List <MemoObject> mobj = new ArrayList<MemoObject>();

		mobj = memoAc.getAllMemo();

		//一番最後に書き込んだメモをobjに入れ込みます
		if(memoAc.getMemokazu() != 0){
			obj = memoAc.getAllMemo().get(memoAc.getMemokazu()-1);
			memoAc.makeTost("現在メモが"+memoAc.getMemokazu()+"つあります。");
		}else{
			memoAc.makeTost("まだメモ帳が空ですよん");
			}

	}
	protected void onDraw(Canvas c) {
		buck.draw(c);

		Paint p = new Paint();

		if(memoAc.getMemokazu() != 0){
			p.setColor(Color.WHITE);
			p.setTextSize(30);
			c.drawText(""+obj.getTitle(), 147, 488, p);
			c.drawText(""+obj.getDay(), 168, 554, p);
			//メモの内容の長さによって表示サイズ変更
			int size = 30;
			if(obj.getMemo().length() > 13){size = 20;}
			if(obj.getMemo().length() > 20){size = 15;}
			if(obj.getMemo().length() > 26){size = 10;}
			p.setTextSize(size);
			c.drawText(""+obj.getMemo(), 33, 662, p);
		}

	}

	//タップ処理
	public boolean onTouchEvent(MotionEvent event){
		int action = event.getAction();
		int x = (int)event.getX();
		int y = (int)event.getY();
		switch(action){
		case MotionEvent.ACTION_DOWN:
			if(mesod.RectTap(x, y, btn1) == true){
				memoAc.setnewMemoLayout();
			}

			if(mesod.RectTap(x, y, btn2) == true){
				if(memoAc.getMemokazu() != 0){
					memoAc.setsubListView();
				}
			}
			break;
		}

		invalidate();
		return true;
	}
}

						

ファイル名「MemoObject.java」


package and.roid.memo;

public class MemoObject {
	private String day;
	private String title;
	private String memo;

	MemoObject(){}
	MemoObject(String day,String title,String memo){
		this.day = day;
		this.title = title;
		this.memo = memo;
	}
	public String getDay(){return day;}
	public String getTitle(){return title;}
	public String getMemo(){return memo;}

	public void setDay(String d){day = d;}
	public void setTitle(String t){title = t;}
	public void setMemo(String m){memo = m;}
}

						

ファイル名「ListAdapter.java」


/*
 * リストビューに渡すデータをまとめているクラス
 * コードいぢりで使用したまんま使用しています
 */
package and.roid.memo;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter{
	private Context context;
	private List<MemoObject> list;//memoクラス用

	public ListAdapter(Context context,List mo) {
		super();
		this.context = context;
		list = mo;
	}

	public int getCount() {
		return list.size();
	}

	public MemoObject getItem(int position) {

		return list.get(position);
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder;
		MemoObject memo = (MemoObject) getItem(position);

		if (convertView == null) {
			LayoutInflater inflater = LayoutInflater.from(context);
			convertView = inflater.inflate(R.layout.listviewmemo, null);

			holder = new ViewHolder();
			holder.tv1 = (TextView) convertView.findViewById(R.id.text_day);
			holder.tv2 = (TextView) convertView.findViewById(R.id.text_title);

			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.tv1.setText(memo.getDay());
		holder.tv2.setText(memo.getTitle());

		return convertView;
	}

}

						

ファイル名「ViewHolder.java」


package and.roid.memo;

import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder {
	TextView tv1;
	TextView tv2;
	ImageView iv;
}

						

ファイル名「Mesod.java」


package and.roid.memo;

import android.graphics.Rect;

public class Mesod {
	static public final float XPERIA_W = 480f;
	static public final float XPERIA_H = 854f;
	static public final float ZERO = 0f;


	public boolean RectTap(int x,int y,Rect gazou){
		return gazou.left < x && gazou.top < y && gazou.right > x && gazou.bottom > y;
	}
	public int setSizeX(float disp_w,float zahyou){return (int) (zahyou * (disp_w / XPERIA_W));}
	public int setSizeY(float disp_h,float zahyou){return (int) (zahyou * (disp_h / XPERIA_H));}
}

						
 
結果
 

 

こんな感じで完成しました。

新しいコードとかは、SDカードにあるファイルの読み込み書き込みファイルの消去、日付日時の取得、xmlファイルレイアウトでの画面の切り替え。くらいでしょうか。日付日時以外はコードいぢりで勉強したことの応用になっています。

勉強してきたことよりも応用のほうがコードが短くて簡単になっているというシマツ・・・

今回のキモとしては、Viewクラスをextendsしたクラスを呼び出すのに、main.xmlレイアウトファイルを呼び出すことでViewクラスを呼び出せるようにした所です。これによりxmlファイルを呼び出すだけで画面を簡単に切り替えることができるようになっています。

画面切り替え

最初は直接Viewクラスを呼び出していたのですが、2、3回画面を切り替えるとエラーになり、たぶん理由として、ActivityクラスでViewクラスを呼び出す時に、setContentView(new Memo1View ) としていたのですが、何回もnew してメモリでも食ったのかなぁと・・・原因はよくわかりませんが、そんなこんなでxmlファイルを呼び出すだけにしたいためにこのような仕様にしました。

SDカード使用

今回SDカードを使用した目的として、今まで勉強したファイル書き込み読み込みは、ある程度小さな容量のデータ保存に適しているきがします。ゲームならセーブデータなど。メモ帳となると保存したいデータは無限大ですよね。SDカードも有限ですがPCなどに保存もできますし。単適な目的のシンプルなメモ帳なのでそこまでたくさんのメモが必要というわけでもありません。しかしやはり大規模なこのようなアプリになったときのためにSDカードにあるファイルの読み込み書き込みに挑戦してみました。データはcsv形式で日時、タイトル、内容でそれぞれ別に保存されます。あといくつメモが保存されたかの数字が保存されたファイルもあります。

今回データ保存時に、コードいぢりでもやったデータの上書き、追記で、なぜか上書きができないことになってしまいました。メモされた数を知るのに、上書きしたつもりが追記になってしまい1→2にするつもりが12になってしまうという。考えるのもあれだったので、一度ファイルごと消し、新たに保存するという力技にしました。

編集モードで編集保存、編集メモ消去のどちらも、一度ファイルを消去して、アプリ側で保持編集した値を使用してもう一度ファイルの作成、保存としています。この消去しているタイミングで電源落ちとかなったら怖いのですが、他にいい方法がなかったのでこんな方法になりました。

日付日時の取得

これは簡単ですね。書いてあるコードそのまま使えますよ!

その他

今回作成してわかったことをちょこっと。

レイアウトに関することで気づいたのですが、今回の場合、xmlファイルでレイアウトをして、Activityファイルは一つです。なので基本一つのActivity画面で表示するものを変えているだけな感じになっています。表示されるレイアウト部品を使用したい時などは、このActivityの手の届く範囲でメソッドを書かないといけないということがわかりました。

this.findViewById(R.id.save);などで、アイテムを使用する準備をするのですが、このthisの部分を表記できない範囲だと使用ができなくなってしまいます。なのでこの部品を使用するだけのメソッドを今回ちょっと使用したりしています。

あとはアプリで初期設定する変数はなるべく少なくして、メソッドもvoid型を少なくすれば、多様性的なコードがもっともっとできる気がします。

今回、このアプリを作成することができたことで、ちょっとだけ自身がつきました。作成し終わったあとでも、前回メモした内容などの表示も、改行仕様にしようかなとか、色々改造しようかとかも思いましたが、それはまた今度違う似たようなアプリ作成をするときに実装することにします。

 

 
 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です