当方向改变时,将字符串保留在登录对话框中 window。 Android

Keeping strings in a login dialog window when orientation change. Android

当方向改变时,我试图保留用户在我的登录对话框 window 中输入的内容,但我总是收到此错误消息:

Attempt to invoke virtual method 'android.view.View android.widget.RelativeLayout.findViewById(int)' on a null object reference.

有代码:

public class ReservationActivity 扩展 AppCompatActivity {

ImageView uDeM_Logo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reservation);

    uDeM_Logo = (ImageView)findViewById(R.id.UdeM_Logo);

    dimensions();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    RelativeLayout login = (RelativeLayout)findViewById(R.id.loginLayout);

    EditText userField = (EditText) login.findViewById(R.id.userEditText);
    EditText passField = (EditText) login.findViewById(R.id.passEditText);
    String user = userField.getText().toString();
    String pass = passField.getText().toString();

    outState.putString("User", user);
    outState.putString("Pass", pass);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    RelativeLayout login = (RelativeLayout) findViewById(R.id.loginLayout);

    EditText userField = (EditText) login.findViewById(R.id.userEditText);
    EditText passField = (EditText) login.findViewById(R.id.passEditText);
    String user = savedInstanceState.getString("User");
    String pass = savedInstanceState.getString("Pass");

    userField.setText(user);
    passField.setText(pass);
}

public void onConfigurationChanged(Configuration nouvOrient) {
    if(nouvOrient.orientation == Configuration.ORIENTATION_LANDSCAPE ||
    nouvOrient.orientation == Configuration.ORIENTATION_PORTRAIT)
        dimensions();
}

public void dimensions() {
    Display display = getWindowManager().getDefaultDisplay();
    Point grandeur = new Point();
    display.getSize(grandeur);
    double hauteur = grandeur.y, dim = hauteur * 0.2492;
    int dimsInt = (int) dim;

    ViewGroup.LayoutParams parametres = uDeM_Logo.getLayoutParams();
    parametres.width = dimsInt;
    parametres.height = dimsInt;

    uDeM_Logo.setLayoutParams(parametres);


}

public void loginDialog(View log){
    final Dialog login = new Dialog(this);
    login.setContentView(R.layout.login_dialog);

    Button btnLogin = (Button)login.findViewById(R.id.dialogLoginBtn);
    Button btnCancel = (Button)login.findViewById(R.id.dialogCancelBtn);

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(ReservationActivity.this,
                    "Login Sucessfull", Toast.LENGTH_SHORT).show();
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            login.dismiss();
        }
    });

    login.show();
}

}

不要在 onRestoreInstanceState()

中这样做
 RelativeLayout login = (RelativeLayout) findViewById(R.id.loginLayout);
 EditText userField = (EditText) login.findViewById(R.id.userEditText);
 EditText passField = (EditText) login.findViewById(R.id.passEditText);

而是将这些 loginuserFieldpassField 作为 Activity class 中的字段变量,如下所示:

private RelativeLayout login;
private EditText userField, passField;

还将上述 3 行代码从 onSaveInstanceState() 移动到 onCreate(),但修改它们以使用您的字段变量,如下所示:

 login = (RelativeLayout) findViewById(R.id.loginLayout);
 userField = (EditText) login.findViewById(R.id.userEditText);
 passField = (EditText) login.findViewById(R.id.passEditText);

我建议您在 onCreate() 而不是 onRestoreInstanceState() 恢复状态,如下所示:

// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
    // Restore value of members from saved state
    String user = savedInstanceState.getString("User");
    String pass = savedInstanceState.getString("Pass");
    userField.setText(user);
    passField.setText(pass);
} else {
    // Probably initialize members with default values for a new instance
}

原因是因为onRestoreInstanceState()onStart()之后调用,而onCreate()onStart()

之前调用

您似乎不需要重新创建 activity 方向更改。您可以在 manifest.

中为 activity 设置此配置
android:configChanges="keyboardHidden|orientation