当方向改变时 ActionBarActivity 内容被重置 - DrawerLayout
ActionBarActivity content gets reset when orientation changed - DrawerLayout
我一直在这个网站上搜索这个解决方案,但我似乎无法解决这个问题。基本上我在 ActionBarActivity 中创建了滑动菜单,当点击滑动菜单上的项目之一(从 ListView 构造)时,它会向 TextView 显示值。但是当方向改变时(phone 旋转)内容被重置。我在 API 级别 19 (KitKat)
所有代码:
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);
}
没用,其他一些解决方案也试过了,但没有成功。谢谢
你有没有试过把这个放在你的清单 xml 中 Activity:
<activity
android:name=".SomeActivity"
android:configChanges="orientation|screenSize|screenLayout"/>
对于更新的问题,您没有在 onCreate() activity 方法中初始化您的 mDrawerToggle :
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
Android 不记得您在旋转设备时选择了哪个项目。您必须让它记住该项目并在重新创建 Activity 时做出相应的反应。
在这个例子中,我使用了选定的项目索引,因为数据库(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
,这不会咬你的屁股。
我一直在这个网站上搜索这个解决方案,但我似乎无法解决这个问题。基本上我在 ActionBarActivity 中创建了滑动菜单,当点击滑动菜单上的项目之一(从 ListView 构造)时,它会向 TextView 显示值。但是当方向改变时(phone 旋转)内容被重置。我在 API 级别 19 (KitKat)
所有代码:
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);
}
没用,其他一些解决方案也试过了,但没有成功。谢谢
你有没有试过把这个放在你的清单 xml 中 Activity:
<activity
android:name=".SomeActivity"
android:configChanges="orientation|screenSize|screenLayout"/>
对于更新的问题,您没有在 onCreate() activity 方法中初始化您的 mDrawerToggle :
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
Android 不记得您在旋转设备时选择了哪个项目。您必须让它记住该项目并在重新创建 Activity 时做出相应的反应。
在这个例子中,我使用了选定的项目索引,因为数据库(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
,这不会咬你的屁股。