Androidの学習をはじめて14日くらいの人の問題集

Android

今まで学んできた様々な技術を織り交ぜてtodoアプリを作ってみよう。

Q1
todoアプリを作成せよ。データをファイルに保存し、再起動した際に情報を復元できるようにすること。
必要であれば以下のアイコンをダウンロードして使用してよい。

[素材]


[実行例]

スタート画面
todoを登録するボタンがある。

ボタンを押すとSubに遷移して入力フォームが現れる

todoを入力し、アイコンを選ぶ

登録ボタンを押すと、Mainに遷移しリストビューに登録されている。

何件か登録してみる。

項目をタップするとSubに遷移し、編集ができる。この時ボタンの文言は「更新」となっていることに注意

todoとアイコンを編集し、更新ボタンを押す。

Mainに戻り、情報が更新されている。

項目を長押しすると、確認のダイアログが表示される。

はいを押すと項目が削除される(いいえでキャンセル)

●activity_main.xml

01<?xml version="1.0" encoding="utf-8"?>
02<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
03    xmlns:app="http://schemas.android.com/apk/res-auto"
04    android:layout_width="match_parent"
05    android:layout_height="match_parent"
06    >
07 
08    <Button
09        android:id="@+id/button"
10        android:layout_width="0dp"
11        android:layout_height="wrap_content"
12        android:layout_marginLeft="8dp"
13        android:layout_marginRight="8dp"
14        android:layout_marginTop="8dp"
15        android:onClick="btAdd"
16        android:text="todo追加"
17        app:layout_constraintLeft_toLeftOf="parent"
18        app:layout_constraintRight_toRightOf="parent"
19        app:layout_constraintTop_toTopOf="parent"
20        android:layout_marginStart="8dp"
21        android:layout_marginEnd="8dp" />
22 
23    <ListView
24        android:id="@+id/lv"
25        android:layout_width="0dp"
26        android:layout_height="0dp"
27        android:layout_marginLeft="8dp"
28        android:layout_marginRight="8dp"
29        android:layout_marginTop="8dp"
30        app:layout_constraintLeft_toLeftOf="parent"
31        app:layout_constraintRight_toRightOf="parent"
32        app:layout_constraintTop_toBottomOf="@+id/button"
33        app:layout_constraintBottom_toBottomOf="parent"
34        android:layout_marginBottom="8dp" />
35</android.support.constraint.ConstraintLayout>

●activity_sub.xml

01<?xml version="1.0" encoding="utf-8"?>
02<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
03    xmlns:app="http://schemas.android.com/apk/res-auto"
04    android:layout_width="match_parent"
05    android:layout_height="match_parent"
06    android:padding="16dp"
07    >
08 
09    <TextView
10        android:layout_width="wrap_content"
11        android:layout_height="wrap_content"
12        android:layout_marginLeft="0dp"
13        android:text="todo"
14        app:layout_constraintLeft_toLeftOf="parent"
15        android:id="@+id/textView2"
16        app:layout_constraintBaseline_toBaselineOf="@+id/etTodo" />
17 
18    <EditText
19        android:id="@+id/etTodo"
20        android:layout_width="0dp"
21        android:layout_height="wrap_content"
22        android:ems="10"
23        android:inputType="textPersonName"
24        android:text=""
25        app:layout_constraintTop_toTopOf="parent"
26        android:layout_marginTop="8dp"
27        app:layout_constraintLeft_toRightOf="@+id/textView2"
28        android:layout_marginLeft="8dp"
29        android:layout_marginRight="8dp"
30        app:layout_constraintRight_toRightOf="parent" />
31 
32    <TextView
33        android:id="@+id/textView3"
34        android:layout_width="wrap_content"
35        android:layout_height="wrap_content"
36        android:layout_marginLeft="0dp"
37        android:layout_marginTop="8dp"
38        android:text="icon"
39        app:layout_constraintLeft_toLeftOf="parent"
40        app:layout_constraintTop_toBottomOf="@+id/etTodo" />
41 
42    <RadioGroup
43        android:id="@+id/rg"
44        android:layout_width="0dp"
45        android:layout_height="wrap_content"
46        android:layout_marginLeft="8dp"
47        android:layout_marginRight="8dp"
48        android:layout_marginTop="8dp"
49        android:orientation="horizontal"
50        app:layout_constraintLeft_toRightOf="@+id/textView3"
51        app:layout_constraintRight_toRightOf="parent"
52        app:layout_constraintTop_toBottomOf="@+id/etTodo">
53 
54        <RadioButton
55            android:id="@+id/rb1"
56            android:layout_width="wrap_content"
57            android:layout_height="wrap_content"
58            android:layout_weight="1"
59            android:text="赤" />
60 
61        <RadioButton
62            android:id="@+id/rb2"
63            android:layout_width="wrap_content"
64            android:layout_height="wrap_content"
65            android:layout_weight="1"
66            android:text="緑" />
67 
68        <RadioButton
69            android:id="@+id/rb3"
70            android:layout_width="wrap_content"
71            android:layout_height="wrap_content"
72            android:layout_weight="1"
73            android:text="青" />
74    </RadioGroup>
75 
76    <Button
77        android:id="@+id/btBack"
78        android:layout_width="0dp"
79        android:layout_height="wrap_content"
80        android:layout_marginLeft="8dp"
81        android:layout_marginRight="8dp"
82        android:layout_marginTop="8dp"
83        android:onClick="btBack"
84        android:text="登録"
85        app:layout_constraintLeft_toLeftOf="parent"
86        app:layout_constraintRight_toRightOf="parent"
87        app:layout_constraintTop_toBottomOf="@+id/rg" />
88</android.support.constraint.ConstraintLayout>

●list_item.xml

01<?xml version="1.0" encoding="utf-8"?>
02<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
03    xmlns:app="http://schemas.android.com/apk/res-auto"
04    xmlns:tools="http://schemas.android.com/tools"
05    android:layout_width="match_parent"
06    android:layout_height="match_parent"
07    android:padding="16dp">
08 
09    <ImageView
10        android:id="@+id/iv"
11        android:layout_width="60dp"
12        android:layout_height="60dp"
13        app:srcCompat="@drawable/star_b"
14        app:layout_constraintTop_toTopOf="parent"
15        android:layout_marginTop="0dp"
16        android:layout_marginLeft="0dp"
17        app:layout_constraintLeft_toLeftOf="parent" />
18 
19    <TextView
20        android:id="@+id/tvTodo"
21        android:layout_width="wrap_content"
22        android:layout_height="wrap_content"
23        android:layout_marginLeft="8dp"
24        android:padding="10dp"
25        android:text="TextView"
26        app:layout_constraintLeft_toRightOf="@+id/iv"
27        tools:layout_editor_absoluteY="25dp" />
28</android.support.constraint.ConstraintLayout>

●Todo.java

01import java.io.Serializable;
02 
03public class Todo implements Serializable {
04    private String todo;
05    private int resId;
06    public Todo(String todo,int resId){
07        this.todo=todo;
08        this.resId=resId;
09    }
10    public String getTodo(){
11        return this.todo;
12    }
13 
14    public int getResId() {
15        return this.resId;
16    }
17 
18    public void setTodo(String todo) {
19        this.todo=todo;
20    }
21    public void setResId(int resId){
22        this.resId=resId;
23    }
24}

●TodoAdapter.java

01import android.app.Activity;
02import android.content.Context;
03import android.view.LayoutInflater;
04import android.view.View;
05import android.view.ViewGroup;
06import android.widget.BaseAdapter;
07import android.widget.ImageView;
08import android.widget.TextView;
09 
10import java.util.List;
11 
12public class TodoAdapter extends BaseAdapter {
13    private LayoutInflater inflater;
14    private int layout;
15    private List<Todo> list;
16    public TodoAdapter(Context c,int layout,List<Todo> list){
17        inflater=((Activity)c).getLayoutInflater();
18        this.layout=layout;
19        this.list=list;
20 
21    }
22    @Override
23    public int getCount() {
24        return list.size();
25    }
26 
27    @Override
28    public Todo getItem(int position) {
29        return list.get(position);
30    }
31 
32    @Override
33    public long getItemId(int position) {
34        return position;
35    }
36 
37    @Override
38    public View getView(int position, View convertView, ViewGroup parent) {
39        Todo todo=this.getItem(position);
40        ViewHolder holder;
41        if(convertView == null){
42            convertView=inflater.inflate(this.layout,null);
43            holder=new ViewHolder(convertView);
44            convertView.setTag(holder);
45        }else{
46            holder=(ViewHolder)convertView.getTag();
47        }
48        holder.iv.setImageResource(todo.getResId());
49        holder.tvTodo.setText(todo.getTodo());
50        return convertView;
51    }
52    private static class ViewHolder{
53         TextView tvTodo;
54         ImageView iv;
55        public ViewHolder(View v){
56            tvTodo=(TextView)v.findViewById(R.id.tvTodo);
57            iv=(ImageView)v.findViewById(R.id.iv);
58        }
59    }
60 
61}

●MyDialog.java

01import android.app.Dialog;
02import android.app.DialogFragment;
03import android.content.DialogInterface;
04import android.os.Bundle;
05import android.support.v7.app.AlertDialog;
06 
07public class MyDialog extends DialogFragment {
08    @Override
09    public Dialog onCreateDialog(Bundle savedInstanceState) {
10        Bundle b=this.getArguments();
11        final Todo todo=(Todo)b.getSerializable("todo");
12        AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
13        builder.setTitle("確認")
14                .setMessage(todo.getTodo()+"を削除してよろしいですか?")
15                .setPositiveButton("はい", new DialogInterface.OnClickListener() {
16                    @Override
17                    public void onClick(DialogInterface dialog, int which) {
18                        MainActivity activity=(MainActivity)getActivity();
19                        activity.removeItem(todo);
20                    }
21                })
22                .setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
23                    @Override
24                    public void onClick(DialogInterface dialog, int which) {
25 
26                    }
27                });
28        return builder.create();
29    }
30}

●MainActivity.java

001import android.app.DialogFragment;
002import android.content.Intent;
003import android.os.Bundle;
004import android.support.v7.app.AppCompatActivity;
005import android.view.View;
006import android.widget.AdapterView;
007import android.widget.ListView;
008import android.widget.Toast;
009 
010import java.io.FileInputStream;
011import java.io.FileNotFoundException;
012import java.io.FileOutputStream;
013import java.io.IOException;
014import java.io.ObjectInputStream;
015import java.io.ObjectOutputStream;
016import java.util.ArrayList;
017import java.util.List;
018 
019public class MainActivity extends AppCompatActivity {
020    public static final int ADD=1,UPDATE=2;
021    private List<Todo> list=new ArrayList<>();
022    private TodoAdapter adapter;
023    private ListView lv;
024 
025    @Override
026    protected void onCreate(Bundle savedInstanceState) {
027        super.onCreate(savedInstanceState);
028        setContentView(R.layout.activity_main);
029        Object ret=this.readFile();
030        if(ret != null){
031            list=(List<Todo>)ret;
032        }
033        lv=(ListView)findViewById(R.id.lv);
034        adapter=new TodoAdapter(this,R.layout.list_item,list);
035        lv.setAdapter(adapter);
036        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
037            @Override
038            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
039                Intent i=new Intent(MainActivity.this,SubActivity.class);
040                i.putExtra("requestCode",UPDATE);
041                i.putExtra("todo",list.get(position));
042                i.putExtra("index",position);
043                startActivityForResult(i,UPDATE);
044            }
045        });
046        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
047            @Override
048            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
049                Bundle b=new Bundle();
050                b.putSerializable("todo",list.get(position));
051                DialogFragment dialog=new MyDialog();
052                dialog.setArguments(b);
053                dialog.show(getFragmentManager(),"tag");
054                return true;
055            }
056        });
057    }
058    public void btAdd(View v){
059        Intent i=new Intent(this,SubActivity.class);
060        i.putExtra("requestCode",ADD);
061        startActivityForResult(i,ADD);
062    }
063    public void removeItem(Todo todo){
064        list.remove(todo);
065        adapter.notifyDataSetChanged();
066        Toast.makeText(this,todo.getTodo()+"を削除しました。",Toast.LENGTH_SHORT).show();
067    }
068 
069    @Override
070    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
071        super.onActivityResult(requestCode, resultCode, data);
072        if(resultCode == RESULT_OK){
073            Todo t=(Todo)data.getSerializableExtra("todo");
074            switch(requestCode){
075                case ADD:
076                    list.add(t);
077                    break;
078                case UPDATE:
079                    int index=data.getIntExtra("index",-1);
080                    list.set(index,t);
081                    break;
082            }
083            adapter.notifyDataSetChanged();
084        }
085    }
086 
087    @Override
088    protected void onPause() {
089        super.onPause();
090        saveFile();
091    }
092 
093    private void saveFile() {
094        ObjectOutputStream oos=null;
095        try {
096            FileOutputStream fos=openFileOutput("data.dat",MODE_PRIVATE);
097            oos=new ObjectOutputStream(fos);
098            oos.writeObject(list);
099 
100        } catch (FileNotFoundException e) {
101            e.printStackTrace();
102        } catch (IOException e) {
103            e.printStackTrace();
104        }finally{
105            if(oos != null){
106                try {
107                    oos.close();
108                } catch (IOException e) {
109                    e.printStackTrace();
110                }
111            }
112        }
113    }
114    private Object readFile(){
115        Object ret=null;
116        ObjectInputStream ois=null;
117        try {
118            FileInputStream fis=openFileInput("data.dat");
119            ois=new ObjectInputStream(fis);
120            ret=ois.readObject();
121        } catch (FileNotFoundException e) {
122            e.printStackTrace();
123        } catch (IOException e) {
124            e.printStackTrace();
125        } catch (ClassNotFoundException e) {
126            e.printStackTrace();
127        } finally {
128            if(ois != null){
129                try {
130                    ois.close();
131                } catch (IOException e) {
132                    e.printStackTrace();
133                }
134            }
135        }
136        return ret;
137    }
138}

●SubActivity.java

01import android.content.Intent;
02import android.os.Bundle;
03import android.support.v7.app.AppCompatActivity;
04import android.view.View;
05import android.widget.Button;
06import android.widget.EditText;
07import android.widget.RadioGroup;
08 
09public class SubActivity extends AppCompatActivity {
10    private EditText etTodo;
11    private RadioGroup rg;
12    private Button btBack;
13    private Todo t;
14    private int requestCode;
15    private int index;
16    @Override
17    protected void onCreate(Bundle savedInstanceState) {
18        super.onCreate(savedInstanceState);
19        setContentView(R.layout.activity_sub);
20        etTodo=(EditText)findViewById(R.id.etTodo);
21        rg=(RadioGroup)findViewById(R.id.rg);
22        btBack=(Button)findViewById(R.id.btBack);
23        Intent i=this.getIntent();
24        requestCode=i.getIntExtra("requestCode",-1);
25        index=i.getIntExtra("index",-1);
26        if(requestCode == MainActivity.UPDATE){
27            btBack.setText("更新");
28            t=(Todo)i.getSerializableExtra("todo");
29            etTodo.setText(t.getTodo());
30            switch(t.getResId()){
31                case R.drawable.star_r:
32                    rg.check(R.id.rb1);
33                    break;
34                case R.drawable.star_g:
35                    rg.check(R.id.rb2);
36                    break;
37                case R.drawable.star_b:
38                    rg.check(R.id.rb3);
39                    break;
40 
41            }
42 
43        }
44    }
45    public void btBack(View v){
46        Intent i=new Intent();
47        String todo=etTodo.getText().toString();
48        int resId;
49        int checkedId=rg.getCheckedRadioButtonId();
50        switch(checkedId){
51            case R.id.rb1:
52                resId=R.drawable.star_r;
53                break;
54            case R.id.rb2:
55                resId=R.drawable.star_g;
56                break;
57            case R.id.rb3:
58                resId=R.drawable.star_b;
59                break;
60            default:
61                resId=R.drawable.star_r;
62                break;
63        }
64        switch(this.requestCode){
65 
66            case MainActivity.ADD:
67                t=new Todo(todo,resId);
68                break;
69            case MainActivity.UPDATE:
70                t.setTodo(todo);
71                t.setResId(resId);
72                i.putExtra("index",index);
73                break;
74 
75        }
76 
77        i.putExtra("todo",t);
78        this.setResult(RESULT_OK,i);
79        this.finish();
80 
81 
82    }
83}

コメント

タイトルとURLをコピーしました