java - Android Java 登录 Activity 方向更改

标签 java android xml authentication android-orientation

我正在使用来自 ADT 的默认 login_activity.xml,我希望它在翻转设备时改变方向。我在 res/layout-land 目录中有一个单独的 login_activity.xml,因为它似乎已经解决了人们发现的类似问题。

目前,应用程序会在运行时根据设备的方向加载正确的 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);
    }
}

}

垂直登录 Activity

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

横向 Activity 登录

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

最佳答案

在给定 Activity 的 Android Manifest 中,检查您是否已将方向参数添加到 android:configChanges 属性。如果是,请将其删除。

关于java - Android Java 登录 Activity 方向更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277312/

相关文章:

java - 计算机视觉分析

java - JMM 在实践中

java - 如何使用GSON反序列化

android - 使用 Retrofit 发送多个动态字段

xml - 如何在门户网站odoo13上添加所见即所得

xml - 使用R抓取嵌套的XML数据

java - 为什么对于两个具有字符串值的变量,hashCode() 比较为真,而仅比较为假?

java - 获取 Google Maps API 证书的 MD5 指纹时出现问题

android - 无法在Eclipse中使用NDK生成APK文件

xml - 使用 XSL 在 tr 类中交替行颜色