2017-02-18 31 views
0

Я пытаюсь сохранить то, что пользователи напечатал в моем диалоговом окне входа в систему при изменении ориентации, но я всегда получаю сообщение об ошибке:Сохранение строк в диалоговом окне входа в систему при изменении ориентации. Android

попытка вызвать виртуальный метод «android.view.View android.widget .RelativeLayout.findViewById (int) 'на нулевом объекте ссылка.

Там же код:

общественный класс 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(); 
} 

}

enter image description here

+0

Вы проверили мой ответ? –

ответ

0

Кажется, что вам не нужно воссоздавать активность при изменении ориентации. Вы можете просто настроить эту конфигурацию для своей деятельности в своем manifest.

android:configChanges="keyboardHidden|orientation 
0

не делают этого в onRestoreInstanceState()

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

Но вместо того, чтобы эти login, userField, passField полем переменных в классе активность следующим образом:

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()