web-dev-qa-db-fra.com

Quelle est la bonne façon de créer un écran / une activité de connexion dans Android?

Je travaille sur une application Android qui nécessite qu'un utilisateur se connecte avant de faire quoi que ce soit d'autre. Actuellement, j'ai créé une activité principale nommée LoginScreen et après une connexion réussie, cette activité lance une autre activité appelée Accueil. Mais je vois un problème avec cette approche. Que se passe-t-il si l'utilisateur appuie sur le bouton de retour de l'activité d'accueil? Je ne veux pas que l'utilisateur revienne à l'écran de connexion. Quelle est la bonne façon d'empêcher l'utilisateur de le faire. Dois-je gérer les événements de pression de touche?

56
binW

Ce que j'ai fini par faire était de faire en sorte que mon activité à domicile gère l'intention Android.intent.action.MAIN. L'activité d'accueil, lorsqu'elle est lancée, vérifie si l'utilisateur est connecté ou non (en utilisant les préférences partagées), si ce n'est pas le cas, il démarre LoginActivity et appelle finish () sur lui-même.

LoginActivity en cas de connexion réussie démarre l'activité principale et cette fois parce que l'utilisateur est connecté, l'activité principale continuera son cours normal. LoginActivity est déclaré comme suit dans le fichier manifeste:

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

La définition de noHistory et excludeFromRecents sur true pour LoginActivity signifie que l'utilisateur ne peut pas revenir à cette activité à l'aide du bouton de retour.

50
binW

Après avoir appelé startActivity(...) dans l'activité LoginScreen, appelez finish(). Cela supprimera cette activité de la pile d'activités, donc en appuyant sur arrière, vous fermerez essentiellement votre application une fois que vous serez dans votre activité à domicile.

22
Jason Robinson

Essayez de définir des indicateurs sur l'intention.

Exemple:

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

Plus d'informations sur les drapeaux: 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>

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

veuillez voir le code complet sur https://androidpugnator.wordpress.com/2017/03/12/Android-login-and-signup-screens

Image de l'écran de connexion

1
Jaimin Prajapati

Voir: https://stackoverflow.com/a/41290453/4560689 (texte ci-dessous)

Pour ce faire, vous devez créer une seule activité de lancement avec aucun affichage (en utilisant le thème NoDisplay d'Android), qui exécute la logique pour aller à l'écran d'accueil ou se connecter/s'inscrire.

Premièrement, dans votre manifeste:

<?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>

Ensuite, votre 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();
    }
}

Gist here: https://Gist.github.com/chanakin/c44bf1c6a9a80d2640440b5aaa92c8ee

1
Chantell Osejo

Appelez startActivity (...) dans le LoginActivity sur un événement (par exemple, cliquez sur le bouton de connexion). Utilisez également une classe de base de données distincte pour stocker le nom d'utilisateur et le mot de passe de l'utilisateur de la classe HomeActivity.

Gérez l'événement onKeyDown () pour contrôler le bouton de retour dans HomeActivity (utilisez la méthode finish ()).

Dans OnCreate () méthode de la classe LoginActivity, utilisez la connexion à la base de données pour vérifier si le mot de passe du nom d'utilisateur existe déjà dans la table de base de données si oui, appelez startActivity () là aussi pour accéder directement à HomeScreen de LoginScreen.Cela ne montrera pas le LoginScreen.

J'espère que cela fonctionnera pour vous. Essayez-le.

0
Dinesh Sharma