2013-06-14 4 views
1

Я строю свое первое приложение, и я почти готов. (yay!) Теперь все, что мне нужно сделать, это настроить Java для onConfigurationChange, используемого при изменении ориентации, а также вытащить клавиатуру. Во-первых, проблема в том, что при изменении ориентации все стирается, потому что новый метод компоновки вводится методом setContentView. Это, конечно, имеет смысл, однако мне было интересно, есть ли способ или возможное обходное решение, что значения edittext и textview остаются постоянными при изменении ориентации/клавиатуры. Я пробовал различные вещи, такие как взятие строковых значений перед setContentView, однако я обнаружил, что это приведет только к исключению NullPointerException.Как обновить макет после onConfigurationChange?

В основном я пытаюсь сохранить значения edittext и textview в качестве ориентации или любых изменений.

Вот краткое изложение моего кода для ссылки

Это не реальный код, только резюме пФ, что я делаю.

public class MainActivity extends Activity { 

     protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //do some stuff that is the core of the app. Nothing that would impact this question though 

    } 

     public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ 

     setContentView(R.layout.landscape); 
      // same code that was within the onCreate. Just doing stuff related to my app 

    }if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 

     setContentView(R.layout.main); 
      // same code that was within the onCreate. Just doing stuff related to my app 
    } 
     } 
    ' } 

И да, я пишу в своем AndroidManifest подать андроида: configChanges = «ориентация | keyboardHidden» приложение работает как и должно быть, я просто не имею текст viwes и edittexts обновляются. Спасибо!

ответ

0

Однако мне было интересно, есть ли способ или возможное обходное решение, что значения edittext и textview остаются постоянными при изменении ориентации/клавиатуры.

Выполнение этого таким образом ... нет. Когда вы вызываете setContentView(), он ставит все по умолчанию, поэтому TextView s будет иметь свой текст по умолчанию и т. Д. Вы могли бы, как вы сказали, попытаться сохранить Strings и установить их снова, но это будет беспорядочно. Вы можете обработать «рекомендованный Android» способ и использовать Handling Runtime Changes. Тем не менее, я в настоящее время обрабатываю их все, но я не звоню setContentView() во время изменений orientation.

Если бы вы рассказали нам, почему вы так делали это, тогда мы сможем дать вам лучшее решение. Но я не хотел бы предложить вызов setContentView() нескольких раз, как этого

Небольшого пример

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     newConfig = Globals.getUserLanguage(this); 
     super.onConfigurationChanged(newConfig); 
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
     { 
      btnSave = (Button) findViewById(R.id.lsSaveBtn); 
      Button btnHide = (Button) findViewById(R.id.button1); 
      btnHide.setVisibility(Button.GONE); 
      btnSave.setVisibility(Button.VISIBLE); 
    // btnSave.setOnClickListener(); 
     } 
     else 
     { 
      btnSave = (Button) findViewById(R.id.button1);  
      Button btnHide = (Button) findViewById(R.id.lsSaveBtn); 
      btnHide.setVisibility(Button.GONE); 
      btnSave.setVisibility(Button.VISIBLE); 
     } 
    } 
+0

Я делал это так, так как мой опыт программирования был низким, и единственный способ, которым я знал, переключить взгляд на вещи - это использовать новый макет. Я также подумал, что это было легче, но я думаю, что я ошибся. Это было до того, как я узнал о какой-то тактике для использования в java для изменения пользовательского интерфейса. Anyways есть какой-то метод, который я могу использовать, который будет слушать изменения в edittext/textview, и я использую эту информацию для обновления новых? – Dan

+0

Я понимаю, что я новичок ... не волнуйся, ты получишь. Я точно не знаю, что вы просите, но я добавил небольшой пример «Активность», где я показываю или скрываю определенные 'View' в зависимости от 'ориентации' – codeMagic

0

Вы можете сохранить значение в savedInstanceState.

По мере того как ваша деятельность начинает останавливаться, система вызывает onSaveInstanceState(), поэтому ваша активность может сохранять состояние.

Как восстановить значение, вы можете использовать

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 

    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
     // Probably initialize members with default values for a new instance 
    } 
    ... 
} 

или

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 

    // Restore state members from saved instance 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} 

Вы также можете поместить макет в layout папке для Портретного и layout-land для пейзажа, так что вам не нужны звоните setContentView() в каждый раз приложения restart Деятельность

link: activity recreating