Androidアプリの作り方

プログラムの基本

テキストや画面などを配置して作成した画面を実際に表示や遷移したり、ボタンなどを動作させるためにはjavaファイル(アクティビティ)を編集します。

javaファイルはapp->java->パッケージ名->MainActivity.javaを開いて編集します。
※MainActivity.javaはアプリ起動時に呼ばれプロジェクトの起点で処理の中心。
※MainActivity.javaだけで複数の画面を表現することも可能だがコードが複雑になるので他の画面を表現する時は別のjavaファイル(アクティビティ)を作成する方がわかりやすい。
プログラムの基本

MainActivity.javaの例。 ※各用語はjava用語一覧参照


package jp.co.orust.ForeignMusic; //パッケージ名

//importで設定することによって使いたいクラスをプログラムに取り込む
import android.app.Activity; //Android SDKに含まれるandroid.appパッケージのActivityクラス
import android.os.Bundle;  //Android SDKに含まれるandroid.osパッケージのBundleクラス
import android.view.Menu;  //Android SDKに含まれるandroid.viewパッケージのMenuクラス
import android.view.MenuItem;  //Android SDKに含まれるandroid.viewパッケージのMenuItemクラス
import android.widget.Button; //Android SDKに含まれるandroid.widget パッケージのButtonクラス

public class MainActivity extends Activity {  //Activityクラス(android.appパッケージ)を継承する

    @Override //スーパークラスのメソッドをオーバーライドする
    protected void onCreate(Bundle savedInstanceState) { //アプリ起動時に自動的に呼び出されるメソッド
        super.onCreate(savedInstanceState); //スーパークラスのメソッドの呼び出し
        setContentView(R.layout.activity_main); //xmlファイル(res\layout\activity_main.xml)を読み込んで画面に表示
          //ボタンの設定
        Button btn1 = (Button) this.findViewById(R.id.button1);  //Buttonオブジェクト取得 Buttonクラス名 btn1変数名 findViewByIdソースコード外のリソース(ID値button1)を利用する)
        btn1.setOnClickListener(new View.OnClickListener(){ // setOnClickListenerクリックイベント受け取り View.OnClickListenerビューのクリック処理
        //クリック毎に呼び出されるメソッド
            public void onClick(View v) { //public全てのクラス void戻り値(何もしない)onClickメソッド (View引数 v変数名)(View⇒Button、EditText、TextView、全てViewクラスのサブクラス)
                Intent intent = new Intent(MainActivity.this, SecondActivity.class); //Intentインテント(他のアクティビティを呼び出す仕組み)オブジェクト生成 intent(変数名)(この画面と、遷移する画面を指定)
                startActivity(intent); //遷移する画面のアクティビティ起動
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) { //public全てのクラス boolean戻り値(真偽値) onCreateOptionsMenuオプションメニューの初期化と作成 (Menu引数 menu変数名)
        getMenuInflater().inflate(R.menu.menu_main, menu); //getMenuInflater()メニュー定義ファイル(res\menu\menu_main.xml)読み出し .inflateメインのlayoutに別のレイアウトを動的に挿入 ()
        return true; //trueオプションメニュー表示 falseオプションメニュー非表示
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) { //public全てのクラス boolean戻り値(真偽値) onOptionsItemSelectedメニューが選択されると呼び出されるメソッド (MenuItem引数 menu変数名)
        int id = item.getItemId(); //int整数 id変数 item.getItemId()メニュー項目のid値を取得
        if (id == R.id.action_settings) { //左==右 等しければ
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

直径を入力して円の面積を計算するサンプルプログラム

プログラムの基本
<MainActivity.java> - メインソースファイル
<activity_main.xml> - 画面レイアウトファイル
<strings.xml> - 文字列設定ファイル
<colors.xml> - 色設定ファイル
<styles.xml> - スタイル設定ファイル
<dimens.xml> - 余白などの設定ファイル
<button_badkground1.xml> - ボタンのスタイル設定ファイル
<underline_style1.xml.xml> - 下線のスタイル設定ファイル

<MainActivity.java>

package orust.co.jp.myapplication;

import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.text.DecimalFormat;

import static orust.co.jp.myapplication.R.id.numberInput;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //変数設定
    private EditText mInput;
    private Button mButton;
    private TextView mResult;

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

        // オブジェクトを取得
        mInput = (EditText) findViewById(numberInput);
        mButton = (Button) findViewById(R.id.calcButton);
        mButton.setOnClickListener(this);
        mResult = (TextView) findViewById(R.id.calcResult);
    }

    // EditTextに入力がされているかをチェックする
    private boolean checkEditTextInput() {
        // 入力内容を取得する
        String input = mInput.getText().toString();
        // 「空 or null」でなければ、true
        return !TextUtils.isEmpty(input);
    }

    //EditTextにテキストが入力がされていなかった時のダイアログ表示
    private void check() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
        builder.setTitle("確認");
        builder.setMessage("数字が入力されていません");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        //builder.setNegativeButton("いいえ", null);
        builder.create().show();
    }

    // 計算を行う
    private void calc() {

        // 入力内容を取得
        String mInput = this.mInput.getText().toString();

        // 数値に変換
        double numberInput = Double.valueOf(mInput);
        double mHankei = 0.5;
        double mPi = 3.14159265359;

        // 計算
        double Result = numberInput * mHankei * numberInput * mHankei * mPi;
        //BigDecimalの小数桁の末尾の0を削除
        DecimalFormat format = new DecimalFormat("0.##########");
        //計算結果をTextViewに表示
        mResult.setText(String.valueOf(format.format(Result)));
    }

    //ボタンが押された時の処理
    @Override
    public void onClick(View v) {
        int id = v.getId();
        // ボタン押下時の処理
        if (checkEditTextInput()) {
            switch (id) {
                case R.id.calcButton:
                    // 「計算」ボタンが押された時の処理
                    //ソフトキーボード非表示
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                    //計算
                    calc();
                    break;
            }
        } else {
            if (mInput.getText().toString().equals("")) {
                //ダイアログ
                check();
            }
        }
    }
}

<activity_main.xml>

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="orust.co.jp.myapplication.MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center_horizontal"
            android:layout_marginTop="30dp"
            android:paddingBottom="@dimen/activity_vertical_margin"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin">

            <EditText
                android:id="@+id/numberInput"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:layout_alignParentStart="true"
                android:background="@drawable/underline_style1"
                android:ems="10"
                android:hint="@string/hint_diameter"
                android:inputType="number"/>

            <Button
                android:id="@+id/calcButton"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_marginLeft="5dp"
                android:layout_toEndOf="@+id/numberInput"
                android:background="@drawable/button_badkground1"
                android:text="@string/button_calc"
                android:textColor="@android:color/white"/>

            <TextView
                android:id="@+id/textResult"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/calcButton"
                android:layout_marginTop="50dp"
                android:text="@string/circle_area"
                android:textColor="#000000"
                android:textSize="18sp"/>

            <TextView
                android:id="@+id/calcResult"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignEnd="@+id/calcButton"
                android:layout_below="@+id/textResult"
                android:layout_marginTop="20dp"
                android:background="@drawable/underline_style1"
                android:gravity="right"
                android:paddingBottom="5dp"
                android:textColor="#000000"
                android:textSize="18sp"/>

        </RelativeLayout>

    </ScrollView>
</FrameLayout>

<strings.xml>

<resources>
    <string name="app_name">My Application</string>
    <string name="hint_diameter">直径を入力</string>
    <string name="button_calc">計算</string>
    <string name="circle_area">円の面積</string>
</resources>

<colors.xml>

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">
        #3F51B5
    </color>
    <color name="colorPrimaryDark">
        #303F9F
    </color>
    <color name="colorAccent">
        #FF4081
    </color>
    <color name="windowBackground">
        #ffffff
    </color>

    <!--ダイアログの色設定-->
    <!--ボタンの文字色-->
    <color name="dialogcolorAccent">
        #000000
    </color>
    <!--ダイアログの背景色-->
    <color name="dialogbackground">
        #FFFFF0
    </color>
    <!--タイトル、メッセージの文字色-->
    <color name="dialogtextColorPrimary">
        #000000
    </color>

</resources>

<styles.xml>

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">
            @color/colorPrimary
        </item>
        <item name="colorPrimaryDark">
            @color/colorPrimaryDark
        </item>
        <item name="colorAccent">
            @color/colorAccent
        </item>
        <!-- ウィンドウ背景色 -->
        <item name="android:windowBackground">@color/windowBackground</item>
    </style>

    <!--ダイアログの色設定-->
    <style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <!--ボタンの文字色-->
        <item name="colorAccent">
            @color/dialogcolorAccent
        </item>
        <!--ダイアログの背景色-->
        <item name="android:background">
            @color/dialogbackground
        </item>
        <!--タイトル、メッセージの文字色-->
        <item name="android:textColorPrimary">
            @color/dialogtextColorPrimary
        </item>
    </style>

</resources>

<dimens.xml>

<resources>
    <!-- デフォルトの画面の余白 -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>

<button_badkground1.xml>

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <!-- ボタンが押されてない時 -->
    <item android:state_pressed="false">
        <!-- ボタンの形状 -->
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#000000" />
            <gradient android:angle="270" android:endColor="#8f0202" android:startColor="#ff0001" />
            <corners android:radius="5dp" />
        </shape>
    </item>
    <!-- ボタンが押された時 -->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <gradient android:angle="270" android:endColor="#668f0202" android:startColor="#66ff0001" />
            <corners android:radius="5dp" />
        </shape>
    </item>
</selector>

<underline_style1.xml.xml>

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="https://schemas.android.com/apk/res/android">
    <!-- 枠線付き長方形 -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
            <stroke
                android:width="1dp"
                android:color="#000000"/>
        </shape>
    </item>

    <!-- 1dp分の padding を設定した枠線なし長方形 -->
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</layer-list>