2.9.2 ソース2 (クラスファイル)
これまで作成してきたメモアプリの完成版のソースと、各ファイルについて簡単な説明をします。
クラスファイルとしては、以下となります。
・ クラスファイル(*.java)
- MainActivity.java (メイン画面クラス)
- EditActivity.java (編集画面クラス)
それぞれのファイルの完成ソースをのせていきます。
メイン画面クラス
メイン画面クラス(MainActivity.java)では、保存されているメモのファイルを読み込みリストに表示します。
また、メニューから新規作成で編集画面の表示、リスト選択でメモの編集画面表示、リスト長押しでリスト削除等の処理を行います。
MainActivity.java
public class MainActivity extends Activity {
// ListView 用アダプタ
SimpleAdapter mAdapter = null;
// ListView に設定するデータ
List<Map<String, String>> mList = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ListView 用アダプタのリストを生成
mList = new ArrayList<Map<String, String>>();
// ListView 用アダプタを生成
mAdapter = new SimpleAdapter(
this,
mList,
android.R.layout.simple_list_item_2,
new String [] {"title", "content"},
new int[] {android.R.id.text1, android.R.id.text2}
);
// ListView にアダプターをセット
ListView list = (ListView)findViewById(R.id.listView);
list.setAdapter(mAdapter);
// ListView のアイテム選択イベント
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(
AdapterView<?> parent, View view, int pos, long id) {
// 編集画面に渡すデータをセットし、表示
Intent intent = new Intent(MainActivity.this, EditActivity.class);
intent.putExtra("NAME", mList.get(pos).get("filename"));
intent.putExtra("TITLE", mList.get(pos).get("title"));
intent.putExtra("CONTENT", mList.get(pos).get("content"));
startActivity(intent);
}
});
// ListView をコンテキストメニューに登録
registerForContextMenu(list);
}
@Override
protected void onResume() {
super.onResume();
// ListView 用アダプタのデータをクリア
mList.clear();
// アプリの保存フォルダ内のファイル一覧を取得
String savePath = this.getFilesDir().getPath().toString();
File[] files = new File(savePath).listFiles();
// ファイル名の降順でソート
Arrays.sort (files, Collections.reverseOrder());
// テキストファイル(*.txt)を取得し、ListView用アダプタのリストにセット
for (int i=0; i<files.length; i++) {
String fileName = files[i].getName();
if (files[i].isFile() && fileName.endsWith(".txt")) {
String title = null;
String content = null;
// ファイルを読み込み
try {
// ファイルオープン
InputStream in = this.openFileInput(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
// タイトル(1行目)を読み込み
title = reader.readLine();
// 内容(2行目以降)を読み込み
char[] buf = new char[(int)files[i].length()];
int num = reader.read(buf);
content = new String(buf, 0, num);
// ファイルクローズ
reader.close();
in.close();
} catch (Exception e) {
Toast.makeText(this, "File read error!", Toast.LENGTH_LONG).show();
}
// ListView用のアダプタにデータをセット
Map<String, String> map = new HashMap<String, String>();
map.put("filename", fileName);
map.put("title", title);
map.put("content", content);
mList.add(map);
}
}
// ListView のデータ変更を表示に反映
mAdapter.notifyDataSetChanged();
}
// メニュー作成処理
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// メニュー選択処理
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case R.id.action_add:
// [追加] 選択時の処理
// 編集画面を表示
Intent intent = new Intent(MainActivity.this, EditActivity.class);
startActivity(intent);
break;
default:
break;
}
return super.onMenuItemSelected(featureId, item);
}
// コンテキストメニュー作成処理
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
super.onCreateContextMenu(menu, view, info);
getMenuInflater().inflate(R.menu.main_context, menu);
}
// コンテキストメニュー選択処理
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId()) {
case R.id.context_del:
// [削除] 選択時の処理
// ファイル削除
if (this.deleteFile(mList.get(info.position).get("filename"))) {
Toast.makeText(this, R.string.msg_del, Toast.LENGTH_SHORT).show();
}
// リストから削除
mList.remove(info.position);
// ListView のデータ変更を表示に反映
mAdapter.notifyDataSetChanged();
break;
default:
break;
}
return false;
}
}
編集画面クラス
編集画面クラス(EditActivity.java)では、入力されたテキストの内容をファイルに保存します。
また、メニューからファイルの削除処理を行います。
EditActivity.java
public class EditActivity extends Activity {
// 保存ファイル名
String mFileName = "";
// 保存なしフラグ
boolean mNotSave = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
// タイトルと内容入力用の EditText を取得
EditText eTxtTitle = (EditText)findViewById(R.id.eTxtTitle);
EditText eTxtContent = (EditText)findViewById(R.id.eTxtContent);
// メイン画面からの情報受け取り、EditTextに設定
// (情報がない場合(新規作成の場合)は、設定しない)
Intent intent = getIntent();
String name = intent.getStringExtra("NAME");
if (name != null) {
mFileName = name;
eTxtTitle.setText(intent.getStringExtra("TITLE"));
eTxtContent.setText(intent.getStringExtra("CONTENT"));
}
}
@Override
protected void onPause() {
super.onPause();
// [削除] で画面を閉じるときは、保存しない
if (mNotSave) {
return;
}
// タイトル、内容を取得
EditText eTxtTitle = (EditText)findViewById(R.id.eTxtTitle);
EditText eTxtContent = (EditText)findViewById(R.id.eTxtContent);
String title = eTxtTitle.getText().toString();
String content = eTxtContent.getText().toString();
// タイトル、内容が空白の場合、保存しない
if (title.isEmpty() && content.isEmpty()) {
Toast.makeText(this, R.string.msg_destruction, Toast.LENGTH_SHORT).show();
return;
}
// ファイル名を生成 ファイル名 : yyyyMMdd_HHmmssSSS.txt
// (既に保存されているファイルは、そのままのファイル名とする)
if (mFileName.isEmpty()) {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.JAPAN);
mFileName = sdf.format(date) + ".txt";
}
// 保存
OutputStream out = null;
PrintWriter writer = null;
try{
out = this.openFileOutput(mFileName, Context.MODE_PRIVATE);
writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));
// タイトル書き込み
writer.println(title);
// 内容書き込み
writer.print(content);
writer.close();
out.close();
}catch(Exception e){
Toast.makeText(this, "File save error!", Toast.LENGTH_LONG).show();
}
}
// メニュー生成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.edit, menu);
return true;
}
// メニュー選択時の処理
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case R.id.action_del:
// [削除] 選択処理
// ファイル削除
if (!mFileName.isEmpty()) {
if (this.deleteFile(mFileName)) {
Toast.makeText(this, R.string.msg_del, Toast.LENGTH_SHORT).show();
}
}
// 保存せずに、画面を閉じる
mNotSave = true;
this.finish();
break;
default:
break;
}
return super.onMenuItemSelected(featureId, item);
}
}
メモアプリの作成についての説明は以上となります。