2015-12-24 3 views
0

Я искал это решение на этом сайте, но, похоже, я не могу решить эту проблему. В основном я создал меню слайдов в ActionBarActivity, когда один из элементов (построенных из ListView) в меню слайдов щелкнул, он показывает значение TextView. Но когда ориентация изменилась (телефон повернулся), контент был сброшен. Я на уровне API 19 (KitKat)Содержимое ActionBarActivity сбрасывается при изменении ориентации - DrawerLayout

Все коды:

import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.TextView; 
public class MainActivity extends ActionBarActivity { 



    private TextView textview; 
    private ListView navList; 
    private DrawerLayout mDrawerLayout; 
    private ArrayAdapter<String> mAdapter; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private String mActivityTitle; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     navList = (ListView) findViewById(R.id.navList); 
     textview = (TextView) findViewById(R.id.textview); 
     isiElementList(); // isi elemen2 list, dan add masing2 click event. 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mActivityTitle = getTitle().toString(); 
    } 
    private void isiElementList() { 
     String[] osArray = {"Android", "iOS", "Windows"}; 
     mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, osArray); 
     navList.setAdapter(mAdapter); 
     navList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String text = navList.getItemAtPosition(position).toString(); 
       textview.setText(text); 

      } 
     }); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Activate the navigation drawer toggle 
     // Pass elemen2 ListView ke Drawer 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

Я попытался:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

Также:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.activity_main); 
} 

Не работает, некоторые другие решения также пытались, но не повезло. Благодаря

+0

Вам необходимо сохранить последний выбранный элемент в onSaveInstanceState и соответственно отреагировать в onCreate. Независимо от того, что вы делаете, избегайте onConfigurationChanged и android: configChanges, как правило, это плохая практика, возникающая из-за неправильного понимания того, как работает система ... –

+0

Спасибо, но я не уверен, как я это делаю, я относительно не знаком с Android UI, от качающегося фона. ..: \ –

+0

Его хорошо хранить выбранный индекс или идентификатор и вызывать метод onItemSelected (имена разные, но вы получаете точку) в onCreate. Google onSaveInstanceState, вы наверняка найдете хороший учебник. –

ответ

1

Вы пытались сделать это в вашем манифесте XML для деятельности:

<activity 
    android:name=".SomeActivity" 
    android:configChanges="orientation|screenSize|screenLayout"/> 

Для обновленного вопроса вы не инициализировать mDrawerToggle в OnCreate() метод деятельности:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 

      /** Called when a drawer has settled in a completely closed state. */ 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view);      
      } 

      /** Called when a drawer has settled in a completely open state. */ 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
      } 
     }; 

Больше информации здесь:

http://developer.android.com/training/implementing-navigation/nav-drawer.html#ListItemClicks

+0

Это не сработало, но он рухнул ...: D –

+0

что говорит logcat? –

+0

Logcat говорит, что вам нужно инициализировать переменные вида после любого вызова setContentView. Но это не решит вашу проблему с перезагрузкой. –

1

Android не запоминает, какой элемент вы выбрали при повороте устройства. Вы должны запомнить этот элемент и соответствующим образом отреагировать, когда активность будет воссоздана.

В этом примере я использовал индекс выбранного элемента, поскольку база данных (массив mAdapter) не изменяется - индексы стабильны.

private int mSelectedItem; // We remember the selected item index here until config change. 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Setup new layout based on current configuration. 
    setContentView(R.layout.activity_main); 
    // Load view variables after setContentView call. 
    navList = (ListView) findViewById(R.id.navList); 
    textview = (TextView) findViewById(R.id.textview); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mActivityTitle = getTitle().toString(); 

    // Setup database. 
    isiElementList(); // isi elemen2 list, dan add masing2 click event. 

    // Recreate state if applicable. 
    if (savedInstanceState != null) { 
     // Get selected item index from saved state. 
     int selectedItem = savedInstanceState.getInt("selectedItem", 0); 
     // Do the same thing as if the item was just selected. 
     onSelectedItem(selectedItem); 
    } 
} 

private void isiElementList() { 
    String[] osArray = {"Android", "iOS", "Windows"}; 
    mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, osArray); 
    navList.setAdapter(mAdapter); 
    navList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // React to item selection. 
      onSelectedItem(position); 
     } 
    }); 
} 

private void onSelectedItem(int position) { 
    // Remember index of selected item. 
    mSelectedItem = position; 

    // Do something based on this index. Database must be ready at this point! 
    String text = navList.getItemAtPosition(position).toString(); 
    textview.setText(text); 
} 

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

    // Persist selected item index across orientation changes. 
    outState.putInt("selectedItem", mSelectedItem); 
} 

Там нет onConfigurationChanged, это не укусит тебя в задницу.

+0

Это не объясняет, почему макет сбрасывается, особенно onSelectedItem (selectedItem) выходит за рамки проблемы. –

+0

Хотя я все еще новичок, то, как элемент сохраняется, не корректно. ИМО, пользовательский интерфейс в андроиде должен быть обновлен из собственного потока (как и у качания), поэтому безопасный способ, возможно, сохранить состояние (из предыдущего значения) содержимого сам .., но спасибо, я его подниму. –

+0

@KenanBegic Вы правы, исправлены. –

Смежные вопросы