Androidのプログラミング – 投稿 8: 意図 – 画面の切り替え

によって 7 基本以前の投稿, あなたはどのようにインターフェイスのデザインだけでなく、開始イベントボタンを把握相対的安定性与えられました. そして私はまた、あなたのトラックのシリーズを行う場合には、さらにしようとしていることを信じています – 他の人よりも勉強が彼女の家を模索非常に興味津々の子供であることを意味は、別の画面を開くことができるどのようにクリック可能なボタンです. 今日、私たちのすべては、シンプルなアプリを介してそれを行います – ログイン登録.

[qads]

本願の原理について簡単に次のように: あなたのユーザ名とパスワードを入力して、システムにログインする必要があります. trueの場合、新しい画面への移行は、システムの使用を開始します. ユーザーがまだアカウントをお持ちの場合は、アカウントを登録することができます, 登録後、ログイン画面を戻すと、自動的にログイン名ボックスを埋めます. したがって、私たちは、次のアプリケーション図を持っています:

アンドロイドログインフォーム-1

すでに, 今、あなたは、Androidスタジオを開き、新しいプロジェクトを作成します。. ビットが現時点であることに注意してください, Androidのメーカーは、私たちは、ログイン・アクティビティーを作成することができました, それは自動的にコードの多くを生成しますので、しかし、私はそれを使用していません, あなたのためのすべてのものをそのコードを説明するために、それは多くの時間がかかり、このポストに焦点を当てません. だから、自分で自分の研究をオフラインのコードを尋ねます. ここで私は、空のアクティビティから作成されました.

作成あなたのプロジェクトが活動LoginActivityという名前です, ファイルのxmlラactivity_login, タイトルのLAログイン. あなたは一時的にオフラインにjavaをする必要はありませんコード. それでは、メモを作成してみましょう 2 残りの活動でした.
最初のアクティビティの登録を作成します (登録されました). あなたのパッケージを右クリック, 選択します 新しい - >活動 - >空のActivty

アンドロイド作成し、活動

あなたの名前とファイル名インタフェースアクティビティに次の, 多くの場合、自動的に名前アクティビティの下にアテネを置きます.

アンドロイド作成活性-1

あなたに注意してください。 ボックスランチャーアクティビティのチェックを外し NHE. 活動に統合された場合は、アプリを開いたときに開きます.
同様の, 我々はノートメインアクティビティを作成します – ログインインタフェースどこ成功.

今のインタフェースの設計を開始し、Javaコード.

まず、ファイル/res/values/string.xmlで変数の値を設定します

<resources>
    <string name="app_name">TUT8Intent</string>

    <!-- Strings related to login -->
    <string name="login">Login</string>
    <string name="user_name">User name</string>
    <string name="password">Password</string>
    <string name="confirm_password">Confirm Password</string>

    <string name="register">Register</string>

    <string name="action_sign_in_short">Sign in</string>
    <string name="error_field_required">This field is required</string>
    <string name="error_password_not_match">Password not match</string>

    <string name="login_success">Hi, {0}. You login with password is {1}</string>
</resources>

私たちは、ファイルを開くことによって、EditTextのと合わせTextInputLayout設計を使用するようにライブラリを追加します build.gradle そして、編集 依存関係 街:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:design:24.0.0'
}

すべてのインターフェイス上で, 私たちは便利なのLinearLayoutに使用できることがわかりやすいです. ここでLoginActivityのコードインターフェースです.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp">

    <!-- Login progress -->
    <ProgressBar
        android:id="@+id/login_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:visibility="gone" />

    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/editUserName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/user_name"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/editPassword"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <Button
                android:id="@+id/btnLogin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="16dp"
                android:text="@string/login" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

単独でこのセクションでは、オブジェクト以外のものよりを説明しません プログレスバー これは、オブジェクト待機として表示されます, それが回転します (または水平, しかし、ここでのラウンドです) ユーザーの待ち時間を示すために、我々は、ジョブを処理しています.
プロパティ アンドロイド:可視性 価値があります ゴーン それは隠れになります, あなたはそれが表示したい場合、それに値を設定しています 目に見えます

ログイン・アクティビティーの処理Javaコード次のように:

package com.nguyenvanquan7826.tut8intent;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    public static final String KEY_USER_TO_MAIN = "KEY_USER_TO_MAIN";
    public static final String KEY_PASSWORD_TO_MAIN = "KEY_PASSWORD_TO_MAIN";

    public static final String KEY_USER_FROM_REGISTER = "KEY_USER_FROM_REGISTER";

    public static final int REQUEST_CODE_REGISTER = 1;

    private Context context;

    private EditText editUserName;
    private EditText editPassword;

    private ProgressBar progressBar;

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

        context = this;

        connectView();
    }

    private void connectView() {
        editUserName = (EditText) findViewById(R.id.editUserName);
        editPassword = (EditText) findViewById(R.id.editPassword);

        progressBar = (ProgressBar) findViewById(R.id.progressLogin);

        findViewById(R.id.btnLogin).setOnClickListener(this);
        findViewById(R.id.btnRegister).setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.btnLogin:
                login();
                break;
            case R.id.btnRegister:
                register();
                break;
        }
    }

    private void login() {
        boolean error = false;

        showProgress(true);
        // when process we must have sometime

        // get data
        String userName = editUserName.getText().toString().trim();
        String password = editPassword.getText().toString().trim();

        // password empty
        if (TextUtils.isEmpty(password)) {
            editPassword.requestFocus();
            editPassword.setError(context.getResources().getString(R.string.error_field_required));
            error = true;
        }

        // username empty
        if (TextUtils.isEmpty(userName)) {
            editUserName.requestFocus();
            editUserName.setError(context.getResources().getString(R.string.error_field_required));
            error = true;
        }

        // all data is ok
        showProgress(false);

        if (!error) {
            // create intent to show Main Activity
            Intent intent = new Intent(context, MainActivity.class);

            // send data if need
            intent.putExtra(KEY_USER_TO_MAIN, userName);
            intent.putExtra(KEY_PASSWORD_TO_MAIN, password);

            // start Main Activity
            startActivity(intent);
        }
    }

    private void register() {
        Intent intent = new Intent(context, RegisterActivity.class);
        startActivityForResult(intent, REQUEST_CODE_REGISTER);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_REGISTER && resultCode == Activity.RESULT_OK) {
            String userName = data.getStringExtra(KEY_USER_FROM_REGISTER);
            editUserName.setText(userName);
            editPassword.requestFocus();
        }
    }

    private void showProgress(boolean isShow) {
        progressBar.setVisibility(isShow ? View.VISIBLE : View.GONE);
        findViewById(R.id.login_form).setVisibility(!isShow ? View.VISIBLE : View.GONE);
    }
}

このコードでは、注意する必要があります:
– ログイン機能で, 我々が知っています 2 時間 進行状況を表示(真); 進行状況を表示(偽); すなわち時に初期治療や進行状況を表示するには時間がかかります, その後、皮革の処理を終了. しかし、あなたがポップアップ進捗状況が表示されないことを非常に高速我々の仕事のため、.

  • すべてのデータがOKしたら、次に呼び出すためにMainActivityの意図を取り始めます. あなたの注意をここに:
    // create intent to show Main Activity
    Intent intent = new Intent(context, MainActivity.class);
    
    // send data if need
    intent.putExtra(KEY_USER_TO_MAIN, userName);
    intent.putExtra(KEY_PASSWORD_TO_MAIN, password);
    
    // start Main Activity
    startActivity(intent);
    

    +/ 最初の行は、我々は別のアクティビティにActivityから移動する意向を作成する方法です. これでコンテキストはコンテキストです – 現在の活動, MainActivity.classは、私たちが活動に移動する必要があります.
    +/ 最初の行 2,3 我々は、にいくつかのデータを置くために意図を使います, ここをMainActivityにユーザ名とパスワードを与えられています 1 キーワードKEY_USER_TO_MAINとKEY_PASSWORD_TO_MAINです, それはあります 2 定数, それはまた、鍵であります – 私たちは場所を正確にユーザー名を取得することができ、他の側への鍵, パスワードはどこにあります.
    +/ 最後の行は、新しい活動への切り替えを開始することです.

  • あなたは、私がEditTextのEditTextのユーザー名とパスワードにエラーを設定している大きな違いを参照してください。. 以下のようにエラーが私たちは、美しいインターフェイスを持っている場合:

エラーのため、EditTextの

  • ときに呼び出し 登録, 彼らの意図は、類似を作成します, しかし、リコールプロセスには、登録が完了した後, 私たちはEditTextのユーザー名で登録された自分の名前を記入する必要があります, 私はエンドRegisterActivity後に返された結果を受け取ることになりますどのように呼び出す必要があったことは、コマンドユーザー名を介して行われ:
    startActivityForResult(意図, REQUEST_CODE_REGISTER);
    =>スタートパッケージ – 活動を開始, ForResultは、結果を返すことが許されています. ここで, REQUEST_CODE_REGISTERは整数です, 返された結果は、公共Activityから支払われるかどうかを知るためにも、私たちが取得するための鍵であります, 実際には理由, 1 Activtyは、呼び出すことができるとはるかアクティビティアクティビティは、元Activtyに結果を返すことができます.

  • 電子データを受信するには登録を返さ, 我々は関数をオーバーライドする必要があります onActivityResult – ときに返された結果アクティビティ. ここで:
    リクエストコード 主な違いは、我々は公共の活動を呼び出すコードです, RegisterAcitivtyの正しい結果を得るために, 我々は試合がないREQUEST_CODE_REGISTER見るためにそれをチェックする必要があります.
    resultCode 確認コードビューRegisterAcitivty結果を返しません受け入れます, それはRESULT_OKある場合.
    その後、我々はを通じて結果を得ます インテントデータ.

この時点では、絶対にアプリケーションを実行することができます, しかしMainActivityとRegisterActivityで私たちは何も. だから今再び.

インターフェイスコードの主な活動:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.nguyenvanquan7826.tut8intent.MainActivity">

    <TextView
        android:id="@+id/tvMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

コードのJavaアクティビティメイン:

package com.nguyenvanquan7826.tut8intent;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Context context;

    private TextView tvMain;

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

        context = this;

        connectView();
        getData();
    }

    private void connectView() {
        tvMain = (TextView) findViewById(R.id.tvMain);
    }

    private void getData() {
        String userName = getIntent().getStringExtra(LoginActivity.KEY_USER_TO_MAIN);
        String password = getIntent().getStringExtra(LoginActivity.KEY_PASSWORD_TO_MAIN);

        String helloText = context.getResources().getString(R.string.login_success);
        helloText = completeText(helloText, new String[]{userName, password});
        tvMain.setText(helloText);
    }

    private String completeText(String source, String[] items) {
        for (int i = 0; i < items.length; i++) {
            source = source.replace("{" + i + "}", items[i]);
        }
        return source;
    }
}

上記の, 我々は、コマンドを使用してデータを取ります getIntent().getStringExtra, 任意の値を取る、それは我々が送信されたときのように対応するキーと全く同じを送信しなければなりません. 私はKEY_USER_TO_MAINと定数を入れて、なぜ今、あなたは注意KEY_PASSWORD_TO_MAIN? 混乱がないよう, 多くの場所で, 文字列はあなたが男として渡す場合、あなたはそれがKEYだ覚えているし、多くの場所でそれを正しく記述する必要があります. 我々はすべての名前を入れると、すべての[OK]日は、あります, 間違ったことが沸騰の心配はありません.

登録オフライン最後の活動を続けます. とてもあなただけっぽLoginActivityに戻ってデータを送信する方法を気にログインするために似ています.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp">

    <!-- Login progress -->
    <ProgressBar
        android:id="@+id/progressLogin"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:visibility="gone" />

    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/editUserName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/user_name"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/editPassword"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/editRePassword"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/confirm_password"
                    android:inputType="textPassword"
                    android:singleLine="true" />

            </android.support.design.widget.TextInputLayout>

            <Button
                android:id="@+id/btnRegister"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="16dp"
                android:text="@string/register" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

RegisterActivityのJavaコード

package com.nguyenvanquan7826.tut8intent;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {
    private Context context;

    private EditText editUserName;
    private EditText editPassword;
    private EditText editRePassword;

    private ProgressBar progressBar;

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

        context = this;

        connectView();
    }

    private void connectView() {
        editUserName = (EditText) findViewById(R.id.editUserName);
        editPassword = (EditText) findViewById(R.id.editPassword);
        editRePassword = (EditText) findViewById(R.id.editRePassword);

        progressBar = (ProgressBar) findViewById(R.id.progressLogin);

        findViewById(R.id.btnRegister).setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.btnRegister:
                register();
                break;
        }
    }

    private void register() {
        boolean error = false;

        showProgress(true);
        // when process we must have sometime

        // get data
        String userName = editUserName.getText().toString().trim();
        String password = editPassword.getText().toString().trim();
        String rePassword = editRePassword.getText().toString().trim();

        // password empty
        if (TextUtils.isEmpty(rePassword)) {
            editRePassword.requestFocus();
            editRePassword.setError(context.getResources().getString(R.string.error_field_required));
            error = true;
        }

        // password empty
        if (TextUtils.isEmpty(password)) {
            editPassword.requestFocus();
            editPassword.setError(context.getResources().getString(R.string.error_field_required));
            error = true;
        }

        // username empty
        if (TextUtils.isEmpty(userName)) {
            editUserName.requestFocus();
            editUserName.setError(context.getResources().getString(R.string.error_field_required));
            error = true;
        }

        if (!password.equals(rePassword)) {
            editRePassword.requestFocus();
            editRePassword.setError(context.getResources().getString(R.string.error_password_not_match));
            error = true;
        }

        // all data is ok
        showProgress(false);

        if (!error) {
            // create intent to send data back Login Activity
            Intent intent = new Intent();

            // send data
            intent.putExtra(LoginActivity.KEY_USER_FROM_REGISTER, userName);

            setResult(RESULT_OK, intent);
            finish();
        }
    }

    private void showProgress(boolean isShow) {
        progressBar.setVisibility(isShow ? View.VISIBLE : View.GONE);
        findViewById(R.id.login_form).setVisibility(!isShow ? View.VISIBLE : View.GONE);
    }
}