web-dev-qa-db-ja.com

Androidでログイン画面/アクティビティを作成する正しい方法は何ですか?

Android他の操作を行う前にユーザーにログインを要求するアプリケーションに取り組んでいます。現在、LoginScreenという名前のメインアクティビティを作成しました。ユーザーがホームアクティビティから戻るボタンを押すとどうなりますか?ユーザーがログイン画面に戻ることを望まない場合、ユーザーがそれを行わないようにする正しい方法は何ですか?

56
binW

私がやったことは、ホームアクティビティでインテントを処理することでしたAndroid.intent.action.MAIN。ホームアクティビティは、起動時に、ユーザーがサインインしているかどうかを確認し(共有設定を使用)、そうでない場合はLoginActivityを開始し、自分自身でfinish()を呼び出します。

ログインに成功すると、LoginActivityはメインアクティビティを開始しますが、今回はユーザーがログオンしているため、メインアクティビティは通常のコースを継続します。 LoginActivityは、マニフェストファイルで次のように宣言されています。

<activity Android:name="LoginScreen" Android:label="@string/app_name"
    Android:noHistory="true" Android:excludeFromRecents="true">
</activity>

LoginActivityに対してnoHistoryおよびexcludeFromRecentsをtrueに設定すると、ユーザーは[戻る]ボタンを使用してこのアクティビティに戻ることができなくなります。

50
binW

LoginScreenアクティビティでstartActivity(...)を呼び出した後、finish()を呼び出します。これにより、アクティビティスタックからそのアクティビティが削除されるので、ホームアクティビティに入ったら、押し戻すことで基本的にアプリが閉じられます。

22
Jason Robinson

インテントにフラグを設定してみてください。

例:

new Intent(context, SomeActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

フラグの詳細: http://developer.Android.com/reference/Android/content/Intent.html#nestedclasses

1
Vrutin Rathod

LoginActivity.xml

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fitsSystemWindows="true"
    Android:background="#263238">

    <LinearLayout
        Android:orientation="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:paddingTop="80dp"
        Android:paddingLeft="16dp"
        Android:paddingRight="16dp">

        <!-- App Logo -->
        <ImageView Android:id="@+id/logo"
            Android:src="@drawable/logo"
            Android:layout_width="wrap_content"
            Android:layout_height="50dp"
            Android:layout_marginBottom="20dp"
            Android:layout_gravity="center_horizontal" />

        <!--Title TextView-->
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="STOCK BUDDY"
            Android:id="@+id/title"
            Android:textSize="24sp"
            Android:textStyle="bold"
            Android:textColor="#7B869B"
            Android:layout_marginBottom="24dp"
            Android:layout_gravity="center_horizontal"/>

        <!--User Email-->
        <EditText
            Android:id="@+id/login_email"
            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="5dp"
            Android:layout_centerVertical="true"
            Android:layout_width="match_parent"
            Android:layout_height="40dp"
            Android:ellipsize="start"
            Android:gravity="center"
            Android:hint="Email"
            Android:paddingLeft="16dp"
            Android:paddingRight="16dp"
            Android:textColorHint="#cccccc"
            Android:textColor="#7B869B"
            Android:maxLength="40"
            Android:maxLines="1"
            Android:inputType="textEmailAddress"
            Android:background="@drawable/edittextshape"/>

        <!-- User Password -->
        <EditText
            Android:id="@+id/login_password"
            Android:layout_marginTop="5dp"
            Android:layout_marginBottom="10dp"
            Android:layout_centerVertical="true"
            Android:layout_width="match_parent"
            Android:layout_height="40dp"
            Android:ellipsize="start"
            Android:gravity="center"
            Android:paddingRight="16dp"
            Android:paddingLeft="16dp"
            Android:hint="Password"
            Android:textColor="#7B869B"
            Android:textColorHint="#cccccc"
            Android:maxLength="20"
            Android:maxLines="1"
            Android:inputType="textPassword"
            Android:background="@drawable/edittextshape"/>

        <!--Login Button-->
        <Android.support.v7.widget.AppCompatButton
            Android:id="@+id/btn_login"
            Android:layout_width="fill_parent"
            Android:layout_marginTop="5dp"
            Android:layout_marginBottom="24dp"
            Android:background="@drawable/buttonshape"
            Android:text="Login"
            Android:textSize="20sp"
            Android:layout_height="40dp"
            Android:textColor="#ffffff"
            Android:shadowRadius="5"
            Android:onClick="Login"/>

        <!--signup Link TextView-->
        <TextView Android:id="@+id/link_signup"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginBottom="24dp"
            Android:text="No account yet? Create one"
            Android:gravity="center"
            Android:textSize="12sp"
            Android:textColor="#7B869B"/>

    </LinearLayout>
</ScrollView>

buttonshape.xml

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle" >
    <corners
        Android:radius="44dp"
        />
    <gradient
        Android:angle="45"
        Android:centerX="35%"
        Android:centerColor="#63D0C3"
        Android:startColor="#70DB9A"
        Android:endColor="#56C5EE"
        Android:type="linear"
        />
    <padding
        Android:left="0dp"
        Android:top="0dp"
        Android:right="0dp"
        Android:bottom="0dp"
        />
    <stroke
        Android:width="0dp"
        Android:color="#878787"
        />
</shape>

edittextshape.xml

    <?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:thickness="0dp"
    Android:shape="rectangle">
    <solid Android:color="#ffffff"/>
    <stroke Android:width="1dp"
        Android:color="#ffffff" />
    <corners Android:radius="44dp" />
</shape>

.....................

完全なコードをご覧ください https://androidpugnator.wordpress.com/2017/03/12/Android-login-and-signup-screens

ログイン画面の画像

1

参照: https://stackoverflow.com/a/41290453/4560689 (以下のテキスト)

これを行うには、(AndroidのNoDisplayテーマを使用して)ディスプレイなしの単一のランチャーアクティビティを作成し、ホーム画面に移動するか、ログイン/登録するかのロジックを実行する必要があります。

まず、マニフェストで:

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

<-- Permissions etc -->

<application
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name">

    <activity
        Android:name=".onboarding.StartupActivity"
        Android:label="@string/app_name"
        Android:launchMode="singleInstance"
        Android:theme="Android:style/Theme.NoDisplay">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name"
        Android:launchMode="singleTop" />

    <activity
        Android:name=".authentication.controller.AuthenticationActivity"
        Android:label="@string/title_sign_in"
        Android:launchMode="singleTask"
        Android:windowSoftInputMode="adjustResize|stateHidden" />

    <-- Other activities, services, etc -->
</application>

次に、StartupActivity:

package com.example.Android.onboarding;

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;

import com.example.Android.MainActivity;

import com.example.Android.authentication.controller.AuthenticationActivity;

import com.example.Android.util.ResourceUtils;

public class StartupActivity extends Activity {
    private static final AUTHENTICATION_REQUEST_CODE = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (isLoggedIn()) {
            Intent startupIntent = new Intent(this, MainActivity.class);
            startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(startupIntent);
            finish();
        } else {
            Intent startupIntent = new Intent(this, AuthenticationActivity.class);
            startActivityForResult(startupIntent, AUTHENTICATION_REQUEST_CODE);
        }

        super.onCreate(savedInstanceState);
    }

    private boolean isLoggedIn() {
        // Check SharedPreferences or wherever you store login information
        return this.getSharedPreferences("my_app_preferences", Context.MODE_PRIVATE).getBoolean("loggedIn", false);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == AUTHENTICATION_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            Intent startupIntent = new Intent(this, MainActivity.class);
            startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(startupIntent);
        }

        finish();
    }
}

ここの要点: https://Gist.github.com/chanakin/c44bf1c6a9a80d2640440b5aaa92c8ee

1
Chantell Osejo

startActivity(...)を何らかのイベントのLoginActivityで呼び出します(ログインボタンのクリックなど)。また、HomeActivityクラスのユーザーのユーザー名とパスワードを保存するために、別のデータベースクラスを使用します。

HomeActivityで戻るボタンを制御するためのonKeyDown()イベントを処理します(finish()メソッドを使用します)。

OnCreate() LoginActivityクラスのメソッドでは、データベース接続を使用して、データベーステーブルにユーザー名とパスワードが既に存在するかどうかを確認します(存在する場合)startActivity() LoginScreenからHomeScreenへ。これはLoginScreenを表示しません。

これがあなたのために働くことを願っています。それを試してみてください。

0
Dinesh Sharma