0

私は登録フォームに取り組んでいます。これは、スプラッシュ スクリーンの後のアプリケーションの 2 番目のページであり、ログイン フォームと 2 つのボタン (ログインとサインアップ) が表示されます。サインアップをクリックすると、サインアップと終了の 2 つのボタンがあるサインアップ フォームが表示されます。

ユーザーが初めてログインまたはサインアップする必要があるときに入力し、「サインアップ」を押すと、登録プロセスが開始されます。ユーザーは、ユーザー名、パスワード、電子メール アドレス、および携帯電話番号を提供する必要があります。この情報をすべて入力したら、ユーザー名とパスワードでサインインできます。

この部分はすべて正常に動作していますが、私の要件は、登録後、アプリケーションがスプラッシュと MainActivity で再起動されると、サインアップ (アクティビティ) とログイン (アクティビティ) が非アクティブになることです。では、それを機能させるにはどうすればよいでしょうか。誰でもこれで私を助けることができますか?

スプラッシュ アクティビティで始まる LoginActivity と SignUpActivity を非アクティブ化するにはどうすればよいですか。

スプラッシュ アクティビティ

public class SplashScreen extends Activity {
    private long splashDelay = 5000; //5 seconds

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);

        TimerTask task = new TimerTask()
        {

            @Override
            public void run() {
                finish();
                Intent mainIntent = new Intent().setClass(SplashScreen.this, LoginActivity.class);
                startActivity(mainIntent);
            }

        };

        Timer timer = new Timer();
        timer.schedule(task, splashDelay);
    }
}

ログイン:

public class LoginActivity extends Activity {

    Intent i;
    Button signin, signup;
    CheckBox check;
    String name = "", pass = "";
    byte[] data;
    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    InputStream inputStream;
    SharedPreferences app_preferences;
    List<NameValuePair> nameValuePairs;
    EditText editTextId, editTextP;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        signin = (Button) findViewById(R.id.signin);
        signup = (Button) findViewById(R.id.signup);
        editTextId = (EditText) findViewById(R.id.editTextId);
        editTextP = (EditText) findViewById(R.id.editTextP);
        app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
        check = (CheckBox) findViewById(R.id.check);
        String Str_user = app_preferences.getString("username", "0");
        String Str_pass = app_preferences.getString("password", "0");
        String Str_check = app_preferences.getString("checked", "no");
        if (Str_check.equals("yes")) {
            editTextId.setText(Str_user);
            editTextP.setText(Str_pass);
            check.setChecked(true);
        }

    }

    public void Move_to_next() 
    {
        final Handler handle = new Handler();
        Runnable delay = new Runnable() {
            public void run() {
                startActivity(new Intent(LoginActivity.this, SplashActivity.class));
                finish();
            }
        };
        handle.postDelayed(delay,2000);

    }

    public void Move_next() 
    {
        startActivity(new Intent(LoginActivity.this, SignUpActivity.class));
        finish();
    }

    @SuppressLint("NewApi")
    private class LoginTask extends AsyncTask <Void, Void, String> 
    {
        @SuppressLint("NewApi")
        @Override
        protected void onPreExecute() 
        {

            super.onPreExecute();
            // Show progress dialog here
        }

        @Override
        protected String doInBackground(Void... arg0) {
            try {
                httpclient = new DefaultHttpClient();
                httppost = new HttpPost("http://xxx/login1.php");
                // Add your data
                nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("UserEmail", name.trim()));
                nameValuePairs.add(new BasicNameValuePair("Password", pass.trim()));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                // Execute HTTP Post Request
                response = httpclient.execute(httppost);
                inputStream = response.getEntity().getContent();
                data = new byte[256];
                buffer = new StringBuffer();
                int len = 0;
                while (-1 != (len = inputStream.read(data))) {
                    buffer.append(new String(data, 0, len));
                }

                inputStream.close();
                return buffer.toString();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();

            }
            return "";
        }

        @SuppressLint("NewApi")
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // Hide progress dialog here

            if (buffer.charAt(0) == 'Y') {
                Toast.makeText(LoginActivity.this, "login successfull", Toast.LENGTH_SHORT).show();
                Move_to_next();
            } else {
                Toast.makeText(LoginActivity.this, "Invalid Username or password", Toast.LENGTH_SHORT).show();
            }
        }
    }
4

7 に答える 7

3

ここでこのコードを試します:

final Class<?> target;
boolean isUserLoggedIn = app_preferences.getBoolean("checked", false);
if(isUserLoggedIn) {
    target = MainActivity.class;
} else {
    target = Login.class;
}

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        finish();
        Intent mainIntent = new Intent().setClass(SplashScreen.this, target);
        startActivity(mainIntent);
    }

};

Timer timer = new Timer();
timer.schedule(task, splashDelay);

ところで、Ralph Pinaがすでに指摘しているように、スプラッシュスクリーンは一般的に Android ではあまり一般的ではありません。ただし、アプリに資格情報を保存しないこともお勧めします。特に保存された設定で。それらは、ルート化されたデバイスで読み取ることができるプレーンな xml ファイルです。セッション Cookie のようなトークンをアプリのどこかに保存することをお勧めします。

于 2013-10-04T10:16:08.460 に答える
2
setContentView(R.layout.splash_screen);
       pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
       Log.v("","onCreate is calling");
       if(pref.getBoolean("activity_executed", false))
       {
            Log.v("","Before if called");
           setContentView(R.layout.splash_screen);
            Log.v("","after if called");
            new Handler().postDelayed(csRunnable1, 3000);

       } 
       else 
       {
          new Handler().postDelayed(csRunnable2, 3000);  
           Editor ed = pref.edit();
           ed.putBoolean("activity_executed", true);
           ed.commit();

       }
   }

   Runnable csRunnable1=new Runnable() 
   {       
       @Override
       public void run() 
       {
            Intent intent = new Intent(SplashScreen.this, SplashActivity.class);
               startActivity(intent);
               finish();

       }
   };

   Runnable csRunnable2=new Runnable() 
    {      
       @Override
       public void run() 
       {
            Intent intent = new Intent(SplashScreen.this, LoginActivity.class);
               startActivity(intent);
               finish();

       }
   };

あなたを助けるこのコードを試してください

于 2013-10-04T08:52:05.580 に答える
1

スプラッシュ ページは、Android デザイン ガイドライン ( http://developer.android.com/design/patterns/help.html)に従って推奨されていません。ユーザーにアプリへのアクセスを 5 秒間待たせるのはなぜですか?

あなたのコードにフィードバック/回答をコメントしました。

SharedPreferences を使用するだけです。それが最も簡単な方法です:

public class SplashScreen extends Activity {
    private long splashDelay = 5000; //5 seconds

    private Activity splashScreen;
    private Intent intent;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);

        splashScreen = this;

        // get your shared preferences stored in your app. If the username has been
        // set then this user has already logged in    
        SharedPreferences prefs = getSharedPreferences("name_for_file", 0);
        // return the username of null if none exists
        String username = prefs.getString("username", null);

        // if user has already logged in, just go to MainActivity
        if (username == null) {
             intent = new Intent(this, LoginActivity.class);
        } else {
             intent = new Intent(this, MainActivity.class);
        }

        TimerTask task = new TimerTask()
        {

            @Override
            public void run() {
                //finish(); <- you don't need to call finish, the OS takes care of that

                splashScreen.startActivity(intent);
            }

        };

        Timer timer = new Timer();
        timer.schedule(task, splashDelay);
    }
}


public class LoginActivity extends Activity {

    Intent i;
    Button signin, signup;
    CheckBox check;
    String name = "", pass = "";
    byte[] data;
    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    InputStream inputStream;
    SharedPreferences app_preferences;
    List<NameValuePair> nameValuePairs;
    EditText editTextId, editTextP;
    Activity loginActivity;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        loginActivity = this;
        signin = (Button) findViewById(R.id.signin);
        signup = (Button) findViewById(R.id.signup);
        editTextId = (EditText) findViewById(R.id.editTextId);
        editTextP = (EditText) findViewById(R.id.editTextP);
        // app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
        app_preferences = getSharedPreferences("name_of_file", 0);
        check = (CheckBox) findViewById(R.id.check);
        // if they got to this activity they are not logged in, so why are you
        // checking here?
        // the common pattern is to use null
        // String Str_user = app_preferences.getString("username", null);
        // String Str_pass = app_preferences.getString("password", null);
        // checked only has two states, use a boolean
        // boolean Str_check = app_preferences.getBoolean("checked", false);
        // if (Str_check)) {
        //    editTextId.setText(Str_user);
        //    editTextP.setText(Str_pass);
        //    check.setChecked(true);
        // }

        signin.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                 LoginTask login = new LoginTask();
                 login.execute();
            }
         });

         signup.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                 Intent intent = new Intent(this, SignUpActivity.class)
                 startActivity(intent);
            }
         });


    }

    // why are you sending them back to the splash?
    public void Move_to_next() 
    {
        final Handler handle = new Handler();
        Runnable delay = new Runnable() {
            public void run() {
                startActivity(new Intent(LoginActivity.this, SplashActivity.class));
                finish();
            }
        };
        //why are you making people wait?
        handle.postDelayed(delay,2000);

    }

    // This is never being called
    public void Move_next() 
    {
        startActivity(new Intent(LoginActivity.this, SignUpActivity.class));
        //finish(); <- the OS will do this
    }

    @SuppressLint("NewApi")
    private class LoginTask extends AsyncTask <Void, Void, String> 
    {
        @SuppressLint("NewApi")
        @Override
        protected void onPreExecute() 
        {

            super.onPreExecute();
            // Show progress dialog here
        }

        // best practice for android is to use HttpUrlConnection: 
        // http://android-developers.blogspot.com/2011/09/androids-http-clients.html
        // there is also AndroidHttpClient, which is the class google used in their
        // Google IO 2013 app. It is pretty clean. https://code.google.com/p/basic-http-client/
        /*
        AndroidHttpClient httpClient = new AndroidHttpClient("http://www.google.com");
        ParameterMap params = httpClient.newParams().add("q", "GOOG");
        httpClient.setMaxRetries(3);
        httpClient.get("/finance", params, new AsyncCallback() {
            public void onComplete(HttpResponse httpResponse) {
                System.out.println(httpResponse.getBodyAsString());
            }
            public void onError(Exception e) {
                e.printStackTrace();
            }
        });
        */
        @Override
        protected String doInBackground(Void... arg0) {
            try {
                httpclient = new DefaultHttpClient();
                httppost = new HttpPost("http://xxx/login1.php");
                // Add your data
                nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("UserEmail", name.trim()));
                nameValuePairs.add(new BasicNameValuePair("Password", pass.trim()));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                // Execute HTTP Post Request
                response = httpclient.execute(httppost);
                inputStream = response.getEntity().getContent();
                data = new byte[256];
                buffer = new StringBuffer();
                int len = 0;
                while (-1 != (len = inputStream.read(data))) {
                    buffer.append(new String(data, 0, len));
                }

                inputStream.close();
                return buffer.toString();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();

            }
            return "";
        }

        @SuppressLint("NewApi")
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // Hide progress dialog here

            if (buffer.charAt(0) == 'Y') {
                Toast.makeText(LoginActivity.this, "login successful", Toast.LENGTH_SHORT).show();
                // don't send them back to the splash, they are logged in
                // save username and pass, and move forward
                SharedPreferences settings = loginActivity.getSharedPreferences("name_of_file", 0);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("username", put whatever you get from server).commit();
                editor.putString("password", put whatever you get from server).commit();
                Intent intent = new Intent(loginActivity, WelcomeActivity.class);
                startActivity(intent);
            } else {
                Toast.makeText(LoginActivity.this, "Invalid Username or password", Toast.LENGTH_SHORT).show();
            }
        }
    }
于 2013-10-03T13:09:22.430 に答える
0

サインイン/サインアップが完了しSharedPreferencesたら、ブール値のフラグを true にして保存しSharedPreferencesます。スプラッシュ画面でこのフラグを確認してください。true の場合は mainactivity に移動し、それ以外の場合はサインアップ アクティビティに移動します。

于 2013-10-03T12:01:40.527 に答える
0

Android では、任意の変数 (ブール値または快適に感じるもの) の値をデータベースまたは sharedpreference のような永続ストレージに格納し、アクティビティを起動する前にこの値を確認する必要があります。値が true の場合、ユーザーは既にサインアップしており、値がfalse は、ログインまたはサインアップ アクティビティを再度表示する必要があることを意味します。

起動前にその変数の値を編集して確認します

スプラッシュ アクティビティ

public class SplashScreen extends Activity {
private long splashDelay = 5000; //5 seconds

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_screen);

    TimerTask task = new TimerTask()
    {

        @Override
        public void run() {
            finish();
// someBoolean  which is stored sharedprefs in your second or login activity
if(someBoolean = true)
Intent mainIntent = new Intent().setClass(SplashScreen.this, LoginActivity.class);
            startActivity(mainIntent)
于 2013-10-03T12:02:22.970 に答える
0

Show SignIn と SignUp Once の共有設定を使用できます。

これは私のスプラッシュ スクリーン コードです。

public class Splash extends Activity {

SessionManage sm;
Context _context;
Thread timer= new Thread(){
    public void run(){
        try{
            sleep(2000);
        }catch(InterruptedException axe){
            axe.printStackTrace();
        }finally{
            sm= new SessionManage(_context);
            startActivity(sm.checkLogin());

        }

    }
        };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.splash);
    this._context= getApplicationContext();

timer.start();

}

これは私のセッションマネージャークラスです

public class SessionManage {
SharedPreferences share;
public static final String filename= "data";
SharedPreferences.Editor editor;
Context _context;
String sname,semail;
ArrayList<String> BookArray;
Set<String> set;
@SuppressLint("CommitPrefEdits")
public SessionManage(Context context){
    this._context= context;
    share = _context.getSharedPreferences(filename, 0);
    editor = share.edit();

}

public void login(String lname, String lemail){
    this.sname= lname;
    this.semail= lemail;

    editor.putString("name", lname);
    editor.putString("email", lemail);

    editor.commit();
}

public Intent checkLogin(){
    Intent vs;

    semail= share.getString("email", "Guest");
     if (semail.equalsIgnoreCase("Guest")){
         vs= new Intent(_context, Login.class );
     }
     else{
         vs= new Intent(_context, Populer.class );
     }
     return vs;
}

これは、ログイン アクティビティのログイン ボタン クリックのコードです。

    sm= new SessionManage(getApplicationContext());
        vs= new Intent(getApplicationContext(), Populer.class);
        sm.login(sname, semail);
   }
于 2013-10-03T12:18:24.193 に答える