PG備忘録

プログラミングいろいろ

Intentでデータを受け取る&渡す(タスク管理アプリ)

初期画面
f:id:olee46:20170606132550j:plain:h300

タスク追加画面
f:id:olee46:20170606132555j:plain:h300

タスク表示画面
f:id:olee46:20170606132601j:plain:h300

機能

・初期画面: 「タスク追加画面」「タスク表示画面」に遷移
・タスク追加画面: タスクを追加する→OKボタンで「初期画面」にデータを渡して遷移
・タスク表示画面: データを受け取る→タスク表示→BACKボタンで「初期画面」に戻る

ポイント

  • setTextの中ではStringの演算はしない 例:setText("This is a "+"task")→エラーを吐く
  • putExtraはactivity開始時・終了時どちらでも使える
  • android:labelで画面のタイトルを設定
  • AndroidManifest.xmlでactivityを追加するのを忘れずに!

必要なファイル

activity_main.xml

f:id:olee46:20170606132605j:plain:h300

MainActivity.java

package com.example.orisa.myintent5;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //部品の変数
    Button addBtn, showBtn;

    //request code
    private final static int REQUEST_CODE_ADD = 1;

    //taskのデータを受け取る変数
    String task = "empty task";
    String date = "empty date";
    String time = "empty time";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //部品の取得
        addBtn = (Button)findViewById(R.id.addBtn);
        showBtn = (Button)findViewById(R.id.showBtn);

        //リスナーの設定
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplication(), AddActivity.class);
                startActivityForResult(intent, REQUEST_CODE_ADD);
            }
        });

        showBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplication(), ShowActivity.class);
                //値を格納
                intent.putExtra("TASK_SHOW", task);
                intent.putExtra("DATE_SHOW", date);
                intent.putExtra("TIME_SHOW", time);
                //intentの開始
                startActivity(intent);
            }
        });

    }

    //値を受け取る
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case REQUEST_CODE_ADD:
                if(resultCode == RESULT_OK){
                    //値を受け取る
                    task = data.getStringExtra("TASK_ADD");
                    date = data.getStringExtra("DATE_ADD");
                    time = data.getStringExtra("TIME_ADD");
                }else if (resultCode == RESULT_CANCELED){
                    //Toastを表示
                    Toast.makeText(MainActivity.this, "task entry cancelled", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

}

activity_add.xml

f:id:olee46:20170606132610j:plain:h300

AddActivity.java

package com.example.orisa.myintent5;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class AddActivity extends AppCompatActivity{

    //部品の変数
    EditText addTask, addDate, addTime;
    Button okBtn, cancelBtn;

    //Intent変数
    Intent intent = new Intent();


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        //部品の取得
        addTask = (EditText)findViewById(R.id.addTask);
        addDate = (EditText)findViewById(R.id.addDate);
        addTime = (EditText)findViewById(R.id.addTime);
        okBtn = (Button)findViewById(R.id.okBtn);
        cancelBtn = (Button)findViewById(R.id.cancelBtn);

        //リスナーを設定
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //値を入れる
                intent.putExtra("TASK_ADD", addTask.getText().toString());
                intent.putExtra("DATE_ADD", addDate.getText().toString());
                intent.putExtra("TIME_ADD", addTime.getText().toString());
                //Resultを入れる
                setResult(RESULT_OK, intent);
                //intentの終了
                finish();
            }
        });

        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Resultを入れる
                setResult(RESULT_CANCELED, intent);
                //intentの終了
                finish();
            }
        });

    }
}

activity_show.xml

f:id:olee46:20170606132614j:plain:h300

ShowActivity.java

package com.example.orisa.myintent5;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
 * Created by orisa on 2017/06/06.
 */

public class ShowActivity extends AppCompatActivity{

    //部品の変数
    TextView showTask, showDate, showTime;
    Button backBtn;

    //データを入れる変数
    String task_show, date_show, time_show;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);

        //部品の取得
        showTask = (TextView)findViewById(R.id.showTask);
        showDate = (TextView)findViewById(R.id.showDate);
        showTime = (TextView)findViewById(R.id.showTime);
        backBtn = (Button)findViewById(R.id.backBtn);

        //intentを受け取る
        Intent intent = getIntent();

        //intentのデータを受け取る
        task_show = intent.getStringExtra("TASK_SHOW");
        date_show = intent.getStringExtra("DATE_SHOW");
        time_show = intent.getStringExtra("TIME_SHOW");

        //データを表示
        showTask.setText(task_show);
        showDate.setText(date_show);
        showTime.setText(time_show);

        //リスナーの設定
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //intentの終了
                finish();
            }
        });


    }
}

Intentでデータを受け取る

f:id:olee46:20170606014521j:plain:h300 f:id:olee46:20170606014523j:plain:h300

機能:

・「ADD」ボタンで画面1→画面2(入力画面)に遷移
・画面2(入力画面)でデータを入力する
・画面1で入力されたデータを表示する

必要なファイル:

activity_main.xml

f:id:olee46:20170606014513j:plain:h300

MainActivity.java

package com.example.orisa.myintent4;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //部品の変数
    Button addBtn;
    TextView showTask;

    //定数
    private final static int REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //部品の取得
        addBtn = (Button)findViewById(R.id.addBtn);
        showTask = (TextView)findViewById(R.id.showTask);

        //リスナーをつける
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplication(), SubActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });

    }

    //値を受け取る
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case REQUEST_CODE:
                if(resultCode == RESULT_OK){
                    String task = data.getStringExtra("TASK_STRING");
                    String time = data.getStringExtra("TIME_STRING");
                    String date = data.getStringExtra("DATE_STRING");
                    //テキストビューに表示
                    String str = "TASK:\n"+task+"\n\nTIME:\n"+time+"\n\nDATE:\n"+date;
                    showTask.setText(str);
                }else if (resultCode == RESULT_CANCELED){
                    Toast.makeText(MainActivity.this, "task creation cancelled", Toast.LENGTH_SHORT);
                }
                break;
            default:
                break;
        }
    }

}

activity_sub.xml

f:id:olee46:20170606014515j:plain:h300

SubActivity.java

package com.example.orisa.myintent4;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class SubActivity extends AppCompatActivity {

    //部品の変数
    EditText addTask, addTime, addDate;
    Button okBtn, cancelBtn;

    //Intent変数
    Intent intent = new Intent();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        //部品の取得
        addTask = (EditText)findViewById(R.id.addTask);
        addTime = (EditText)findViewById(R.id.addTime);
        addDate = (EditText)findViewById(R.id.addDate);
        okBtn = (Button)findViewById(R.id.okBtn);
        cancelBtn = (Button)findViewById(R.id.cancelBtn);

        //okBtnクリック時の処理
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //値を格納
                intent.putExtra("TASK_STRING", addTask.getText().toString());
                intent.putExtra("TIME_STRING", addTime.getText().toString());
                intent.putExtra("DATE_STRING", addDate.getText().toString());
                //Resultを設定
                setResult(RESULT_OK, intent);
                //Intentの終了
                finish();
            }
        });

        //cancelBtnクリック時の処理
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Resultを設定
                setResult(RESULT_CANCELED, intent);
                //Intentの終了
                finish();
            }
        });

    }
}

AndroidManifest.xml

SubActivityの部分だけ追記

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.orisa.myintent4">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SubActivity"
            android:label="@string/app_name" />
    </application>

</manifest>

Calendarアプリ

f:id:olee46:20170601103012j:plain
機能:
・カレンダーを表示
・左右の矢印をクリックすると、月を変えられる
・「月別」ボタンは特に何もしない


注意点:
・Calendar.MONTH は 1月=0, 2月=1, ... ,12月=11 の値を取るので、月をテキストで表示するときは +1 をする


activity_main.xml
Gridlayoutの中にボタンを 6*7 = 42コ 配置する
f:id:olee46:20170601103013j:plain


MainActivity.java
package com.example.orisa.mycalendar1;

import android.icu.util.Calendar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

//部品の変数
Button[] btnTable = new Button[43];
Button btnLeft;
Button btnRight;
TextView ymTv;

//カレンダー変数
Calendar cal = Calendar.getInstance();

//現在の日付・曜日を取得
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int dow = cal.get(Calendar.DAY_OF_WEEK);//日=1, 月=2, 火=3, 水=4, 木=5, 金=6, 土=7
int today = day;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//部品の取得
btnLeft = (Button)findViewById(R.id.btnLeft);
btnRight = (Button)findViewById(R.id.btnRight);
ymTv = (TextView)findViewById(R.id.ymTv);

//矢印のボタンにリスナーをつける
btnLeft.setOnClickListener(this);
btnRight.setOnClickListener(this);

//配列にボタンを格納
for(int i = 1; i < btnTable.length; i++){
String btnId = "btn"+i;
int resId = getResources().getIdentifier(btnId, "id", getPackageName());
btnTable[i] = (Button)findViewById(resId);
btnTable[i].setOnClickListener(this);
}

//年と月を設定
ymTv.setText(year + " / " + (month+1));

//ボタンに文字を割り当てる
cal.set(year, month, 1);//今月初日に設定

day = cal.get(Calendar.DAY_OF_MONTH);//今月初日の日
dow = cal.get(Calendar.DAY_OF_WEEK);//今月初日の曜日
Toast.makeText(this, String.valueOf(month), Toast.LENGTH_LONG).show();

cal.add(Calendar.MONTH, 1);//来月に設定
cal.add(Calendar.DATE, -1);//来月初日-1 = 今月の末日に設定
int lastdate = cal.get(Calendar.DATE);//今月の末日

for(int i = dow; i<=dow+lastdate-1;i++){
btnTable[i].setText(String.valueOf(day));
//今日の日付の色を変える
if(i == dow+today-1){
btnTable[i].setTextColor(getResources().getColor(R.color.colorPrimaryDark));
}
day++;
}

}

@Override
public void onClick(View v) {
if(v == btnLeft){//月を一つ前にずらす
if(month == 0){
month = 11;
year = year - 1;
}else{
month = month - 1;
}
}
else if (v == btnRight){
if(month == 11){
month = 1;
year = year + 1;
}else{
month = month + 1;
}
}

//年と月を設定
ymTv.setText(year + " / " + (month+1));
//日付を設定
cal.set(year, month, 1);

day = cal.get(Calendar.DAY_OF_MONTH);
dow = cal.get(Calendar.DAY_OF_WEEK);

cal.add(Calendar.MONTH,1);
cal.add(Calendar.DATE, - 1);
int lastdate = cal.get(Calendar.DATE);

//日付のテキストをクリアする
for(int i = 1; i < btnTable.length; i++){
btnTable[i].setText(null);
}
//日付のテキストを設定
for(int i = dow; i <= dow+lastdate - 1; i++){
btnTable[i].setText(String.valueOf(day++));
}
}
}


参考サイト:
Androidアプリ作成日記 家計簿アプリその10、カレンダー機能

リソースIDをループで取得

       for(int i = 0; i < btnTable.length; i++){
            String btnId = "btn"+(i+1);
            int resId = getResources().getIdentifier(btnId, "id", getPackageName());
            btnTable[i] = (Button)findViewById(resId);
            btnTable[i].setOnClickListener(this);
        }

t-kashima.hateblo.jp

電卓

f:id:olee46:20170531221545j:plain
機能
・電卓アプリ
・整数値の入力
・小数点での結果の出力


activity_main.xml
f:id:olee46:20170531221547j:plain


MainActivity.java

package com.example.orisa.mytablelayout1;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.annotation.StringDef;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //部品の変数
    Button btn0;
    Button btn1;
    Button btn2;
    Button btn3;
    Button btn4;
    Button btn5;
    Button btn6;
    Button btn7;
    Button btn8;
    Button btn9;

    Button divBtn;
    Button mulBtn;
    Button minBtn;
    Button addBtn;

    Button equalBtn;
    Button clearBtn;

    Button[] btnTable = new Button[15];

    TextView tv;

    //その他の変数
    String left = "";//演算子の左側
    String right = "";//演算子右側
    String op;//演算子
    boolean opIsClicked = false;//演算子がクリックされてればtrue

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //部品の取得
        btn0 = (Button)findViewById(R.id.btn0);
        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);
        btn3 = (Button)findViewById(R.id.btn3);
        btn4 = (Button)findViewById(R.id.btn4);
        btn5 = (Button)findViewById(R.id.btn5);
        btn6 = (Button)findViewById(R.id.btn6);
        btn7 = (Button)findViewById(R.id.btn7);
        btn8 = (Button)findViewById(R.id.btn8);
        btn9 = (Button)findViewById(R.id.btn9);

        divBtn = (Button)findViewById(R.id.divBtn);
        mulBtn = (Button)findViewById(R.id.mulBtn);
        minBtn = (Button)findViewById(R.id.minBtn);
        addBtn = (Button)findViewById(R.id.addBtn);

        equalBtn = (Button)findViewById(R.id.equalBtn);
        clearBtn = (Button)findViewById(R.id.clearBtn);

        tv = (TextView)findViewById(R.id.tv);

        //配列に格納
        btnTable[0] = btn0;
        btnTable[1] = btn1;
        btnTable[2] = btn2;
        btnTable[3] = btn3;
        btnTable[4] = btn4;
        btnTable[5] = btn5;
        btnTable[6] = btn6;
        btnTable[7] = btn7;
        btnTable[8] = btn8;
        btnTable[9] = btn9;
        btnTable[10] = divBtn;
        btnTable[11] = mulBtn;
        btnTable[12] = minBtn;
        btnTable[13] = addBtn;
        btnTable[14] = equalBtn;


        //各ボタンにリスナーをつける
        for(int i = 0; i < btnTable.length; i++) {
            btnTable[i].setOnClickListener(this);

        };

        //clearボタンにリスナ0をつける
        clearBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                left = "";
                right = "";
                op = "";
                opIsClicked = false;
                tv.setText(null);
            }
        });
    }

    @Override
    public void onClick(View v) {
        Button b = (Button) v;
        //ボタンの文字列を取得
        String str = b.getText().toString();
        //ボタンの文字列を表示
        tv.append(" "+str);

        switch(v.getId()){
            case R.id.btn0:
            case R.id.btn8:
            case R.id.btn1:
            case R.id.btn2:
            case R.id.btn3:
            case R.id.btn4:
            case R.id.btn5:
            case R.id.btn6:
            case R.id.btn7:
            case R.id.btn9:
                if(opIsClicked == false){
                    left += str;
                }
                else{
                    right += str;
                }
                break;
            case R.id.divBtn:
                op = "div";
                opIsClicked = true;
                break;
            case R.id.mulBtn:
                op = "mul";
                opIsClicked = true;
                break;
            case R.id.minBtn:
                op = "min";
                opIsClicked = true;
                break;
            case R.id.addBtn:
                op = "add";
                opIsClicked = true;
                break;
            case R.id. equalBtn:
                int leftNum = Integer.parseInt(left);
                int rightNum = Integer.parseInt(right);
                if(op == "div"){
                    tv.append(String.valueOf((double)leftNum/rightNum));
                }else if(op == "mul"){
                    tv.append(String.valueOf((double)leftNum * rightNum));
                }else if(op == "min"){
                    tv.append(String.valueOf((double)leftNum - rightNum));
                } else if(op == "add"){
                    tv.append(String.valueOf((double)leftNum + rightNum));
                }
        }

    }
}


参考サイト
qiita.com

SQLiteのデータの追加・表示・検索

f:id:olee46:20170531191157j:plain
機能
・データの追加
・データベースの表示
・データの検索


activity.xml
f:id:olee46:20170531191152j:plain


MainActivity.java

package com.example.orisa.mydb6;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    //部品の変数
    EditText addText;
    Button addBtn;
    Button showBtn;
    EditText searchText;
    Button searchBtn;
    TextView disp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //部品の取得
        addText = (EditText)findViewById(R.id.addText);
        addBtn = (Button)findViewById(R.id.addBtn);
        showBtn = (Button)findViewById(R.id.showBtn);
        searchText = (EditText)findViewById(R.id.searchText);
        searchBtn = (Button)findViewById(R.id.searchBtn);
        disp = (TextView) findViewById(R.id.disp);

        //データベースの生成
        MyDbHelper hlp = new MyDbHelper(this);
        final SQLiteDatabase db = hlp.getWritableDatabase();

        //データの追加
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues val = new ContentValues();
                val.put("task", addText.getText().toString());
                db.insert("tasktb", null, val);
            }
        });

        //データの検索
        searchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TextViewのクリア
                disp.setText("SEARCH RESULTS:\n");
                //検索文字列の取得
                String str = searchText.getText().toString();

                //検索
                Cursor c = db.query("tasktb", new String[]{"id", "task"}, "task=?", new String[]{str}, null, null, null);
                boolean mov = c.moveToFirst();
                while(mov){
                    disp.append(c.getInt(0)+": "+c.getString(1)+"\n");
                    mov = c.moveToNext();
                }
                c.close();
            }
        });

        //データの表示
        showBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TextViewのリセット
                disp.setText(null);
                Cursor c = db.query("tasktb", new String[]{"id", "task"},
                        null, null, null, null, null);
                boolean mov = c.moveToFirst();
                while(mov){
                    disp.append(c.getInt(0)+": "+c.getString(1)+"\n");
                    mov = c.moveToNext();
                }
                c.close();

            }
        });
    }
}


MyDbHelper.java

package com.example.orisa.mydb6;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by orisa on 2017/05/31.
 */

public class MyDbHelper extends SQLiteOpenHelper {
    public MyDbHelper(Context context){
        super(context, null, null, 1);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE tasktb(id INTEGER PRIMARY KEY, task TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

参考サイト
javabayashi.hatenablog.com