2013-11-29 69 views
1

我正在使用ADT中的默認login_activity.xml,我希望在設備翻轉時更改方向。我在res/layout-land目錄中有一個單獨的login_activity.xml,因爲這似乎解決了人們發現的類似問題。Android Java登錄活動方向更改

目前,該應用程序根據設備在運行時的方向加載正確的xml。如果之後翻轉設備,方向會改變,但佈局保持不變。每個xml都有不同的佈局,看起來更適合其各自的方向。

我想知道這是不是可以做,或者如果我忽略了一個工作修復。

我會發布實際運行應用程序的圖像,但我需要10個聲望才能做到這一點。

下面是我LoginActivity.java和activity_login.xml文件:

//LoginActivity.java 
/** Activity which displays a login screen to the user, offering registration as well.*/ 

public class LoginActivity extends Activity { 
/** 
* Keep track of the login task to ensure we can cancel it if requested. 
*/ 
private UserLoginTask mAuthTask = null; 

// Values for email and password at the time of the login attempt. 
private String  mUsername; 
private String  mPassword; 

// UI references. 
private EditText  mUsernameView; 
private EditText  mPasswordView; 
private View   mLoginFormView; 
private View   mLoginStatusView; 
private TextView  mLoginStatusMessageView; 
private mDMI   app; 

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

    // Set up the login form. 
    mUsernameView = (EditText) findViewById(R.id.username); 
    mUsernameView.setText(mUsername); 

    mPasswordView = (EditText) findViewById(R.id.password); 
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { 
      if ((id == R.id.login) || (id == EditorInfo.IME_NULL)) { 
       attemptLogin(); 
       return true; 
      } 
      return false; 
     } 
    }); 

    mLoginFormView = findViewById(R.id.login_form); 
    mLoginStatusView = findViewById(R.id.login_status); 
    mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message); 

    findViewById(R.id.sign_in_button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      attemptLogin(); 
     } 
    }); 
    findViewById(R.id.getUniqueHardwareID).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      String id = app.getDeviceId().getID(); 
      AlertDialog ad = new AlertDialog.Builder(v.getContext()).create(); 
      ad.setCancelable(false); 
      ad.setTitle("Device ID"); 
      ad.setMessage("The Unqiue ID for this device is: \n" + id); 
      ad.setButton(DialogInterface.BUTTON_POSITIVE, "Ok", (Message) null); 
      ad.show(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.login, menu); 
    return true; 
} 

/** 
* Attempts to sign in or register the account specified by the login form. If there are form errors (invalid email, 
* missing fields, etc.), the errors are presented and no actual login attempt is made. 
*/ 
public void attemptLogin() { 
    if (mAuthTask != null) { 
     return; 
    } 

    // Reset errors. 
    mUsernameView.setError(null); 
    mPasswordView.setError(null); 

    // Store values at the time of the login attempt. 
    mUsername = mUsernameView.getText().toString(); 
    mPassword = mPasswordView.getText().toString(); 

    boolean cancel = false; 
    View focusView = null; 

    // Check for a valid password. 
    if (TextUtils.isEmpty(mPassword)) { 
     mPasswordView.setError(getString(R.string.error_field_required)); 
     focusView = mPasswordView; 
     cancel = true; 
    } else if (mPassword.length() < 4) { 
     mPasswordView.setError(getString(R.string.error_invalid_password)); 
     focusView = mPasswordView; 
     cancel = true; 
    } 

    // Check for a valid email address. 
    if (TextUtils.isEmpty(mUsername)) { 
     mUsernameView.setError(getString(R.string.error_field_required)); 
     focusView = mUsernameView; 
     cancel = true; 
    } 

    if (cancel) { 
     // There was an error; don't attempt login and focus the first 
     // form field with an error. 
     focusView.requestFocus(); 
    } else { 
     // Show a progress spinner, and kick off a background task to 
     // perform the user login attempt. 

     Intent myIntent = new Intent(this.getBaseContext(), MainActivity.class); // hopefully this will switch to 
                       // the 
                       // MainActivity 
     startActivity(myIntent); 
     finish(); 

     mLoginStatusMessageView.setText(R.string.login_progress_signing_in); 
     showProgress(true); 
     mAuthTask = new UserLoginTask(); 
     mAuthTask.execute((Void) null); 

    } 
} 

/** 
* Shows the progress UI and hides the login form. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
private void showProgress(final boolean show) { 
    // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow 
    // for very easy animations. If available, use these APIs to fade-in 
    // the progress spinner. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
     int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); 

     mLoginStatusView.setVisibility(View.VISIBLE); 
     mLoginStatusView.animate().setDuration(shortAnimTime).alpha(show ? 1 : 0) 
       .setListener(new AnimatorListenerAdapter() { 
        @Override 
        public void onAnimationEnd(Animator animation) { 
         mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); 
        } 
       }); 

     mLoginFormView.setVisibility(View.VISIBLE); 
     mLoginFormView.animate().setDuration(shortAnimTime).alpha(show ? 0 : 1) 
       .setListener(new AnimatorListenerAdapter() { 
        @Override 
        public void onAnimationEnd(Animator animation) { 
         mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
        } 
       }); 
    } else { 
     // The ViewPropertyAnimator APIs are not available, so simply show 
     // and hide the relevant UI components. 
     mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); 
     mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
    } 
} 

/** 
* Represents an asynchronous login/registration task used to authenticate the user. 
*/ 
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 
     // TODO: attempt authentication against a network service. 

     try { 
      // Simulate network access. 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      return false; 
     } 

     // TODO: register the new account here. 
     return true; 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 
     mAuthTask = null; 
     showProgress(false); 

     if (success) { 
      finish(); 
     } else { 
      mPasswordView.setError(getString(R.string.error_incorrect_password)); 
      mPasswordView.requestFocus(); 
     } 
    } 

    @Override 
    protected void onCancelled() { 
     mAuthTask = null; 
     showProgress(false); 
    } 
} 

} 

立式登錄活動

//vertical activity_login.xml 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
tools:context=".LoginActivity" > 

<!-- Login progress --> 

<LinearLayout 
    android:id="@+id/login_status" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center_horizontal" 
    android:orientation="vertical" 
    android:visibility="gone" 
    > 

    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" /> 

    <TextView 
     android:id="@+id/login_status_message" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="16dp" 
     android:fontFamily="sans-serif-light" 
     android:text="@string/login_progress_signing_in" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
</LinearLayout> 

<!-- Login form --> 

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

    <LinearLayout 
     style="@style/LoginFormContainer" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="wrap_content" 
      android:layout_height="0dp" 
      android:layout_gravity="top|center_horizontal" 
      android:layout_weight="2" 
      android:scaleType="fitXY" 
      android:src="@drawable/spashscreen" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="0dp" 
      android:layout_gravity="center|bottom" 
      android:layout_weight="3" 
      android:orientation="vertical" > 

      <EditText 
       android:id="@+id/username" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_username" 
       android:inputType="text" 
       android:maxLines="1" 
       android:singleLine="true" /> 

      <EditText 
       android:id="@+id/password" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_password" 
       android:imeActionId="@+id/login" 
       android:imeActionLabel="@string/action_sign_in_short" 
       android:imeOptions="actionUnspecified" 
       android:inputType="textPassword" 
       android:maxLines="1" 
       android:singleLine="true" /> 

      <EditText 
       android:id="@+id/serverInfo" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_address" /> 

      <Button 
       android:id="@+id/sign_in_button" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="16dp" 
       android:paddingLeft="32dp" 
       android:paddingRight="32dp" 
       android:text="@string/action_sign_in_short" /> 

      <Button 
       android:id="@+id/getUniqueHardwareID" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/show_device_id" /> 
     </LinearLayout> 

     <!-- Make this uneditable if the mobile device has a value listed locally --> 
    </LinearLayout> 

</ScrollView> 

</merge> 

水平活動登錄

//horizontal activity_login.xml 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
tools:context=".LoginActivity" > 

<!-- Login progress --> 

<LinearLayout 
    android:id="@+id/login_status" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:gravity="center_horizontal" 
    android:orientation="horizontal" 
    android:visibility="gone" 
    > 

    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" /> 

    <TextView 
     android:id="@+id/login_status_message" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="16dp" 
     android:fontFamily="sans-serif-light" 
     android:text="@string/login_progress_signing_in" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
</LinearLayout> 

<!-- Login form --> 

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

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

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="left" 
      android:layout_weight="2" 
      android:scaleType="matrix" 
      android:src="@drawable/spashscreen" /> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="right" 
      android:layout_weight="3" 
      android:orientation="vertical" > 

      <EditText 
       android:id="@+id/username" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_username" 
       android:inputType="text" 
       android:maxLines="1" 
       android:singleLine="true" /> 

      <EditText 
       android:id="@+id/password" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_password" 
       android:imeActionId="@+id/login" 
       android:imeActionLabel="@string/action_sign_in_short" 
       android:imeOptions="actionUnspecified" 
       android:inputType="textPassword" 
       android:maxLines="1" 
       android:singleLine="true" /> 

      <EditText 
       android:id="@+id/serverInfo" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="@string/prompt_address" /> 

      <Button 
       android:id="@+id/sign_in_button" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="16dp" 
       android:paddingLeft="32dp" 
       android:paddingRight="32dp" 
       android:text="@string/action_sign_in_short" /> 

      <Button 
       android:id="@+id/getUniqueHardwareID" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/show_device_id" /> 
     </LinearLayout> 
    </LinearLayout> 

</ScrollView> 

+0

你需要5個以上 –

回答

1

在給定活動的Android Manifest中,檢查是否已將定向參數添加到android:configChanges屬性。如果是刪除它。

+0

工作正常!非常感謝。 – user3005504