Android统计用户更改方向的次数

Android统计用户更改方向的次数,android,Android,我试图创建一个基本的应用程序,只计算用户将方向从纵向更改为横向的次数,并在屏幕上显示计数。我有: public class MainActivity extends Activity { int count = 0; private static boolean inLandscape = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt

我试图创建一个基本的应用程序,只计算用户将方向从纵向更改为横向的次数,并在屏幕上显示计数。我有:

public class MainActivity extends Activity {
int count = 0;
private static boolean inLandscape = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tv = (TextView) findViewById(R.id.count);
    tv.setText(getResources().getString(R.string.count) + ' ' + count);
    if (!inLandscape && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        inLandscape = true;
        count++;
        Log.e("Debug","In Landscape " + count);
    }
    else if (inLandscape && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
        inLandscape = false;
}
问题是,在我的调试语句中,count始终为1,并且屏幕上的文本从不更改。做一些研究,我认为这是因为每次方向改变时,活动都会被破坏和重新创建。如何在整个方向更改过程中保持变量值

我试着用savedInstanceState和

if (savedInstanceState.containsKey("count"))
            count = savedInstanceState.getInt("count");
savedInstanceState.putInt("count", count);

但这会在
containsKey
行中产生NullPointerException。

覆盖
onSaveInstanceState
以存储方向更改计数器

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putInt("count", count)
}
并重写onRestoreInstanceState以在更改后将其读回

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    count = savedInstanceState.getInt("count");
}

显然,您仍然可以将代码保留在“onCreate”中的相同位置,以便根据每次调用onCreate时的方向有条件地添加到计数器中。

这会给您一个NullPointerException,因为saveInstanceState为null。您还需要将
savedInstanceState.putInt(“count”,count)
放在
onRestoreInstanceState
方法中。所以你的代码看起来像

int mCount;    

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tv = (TextView) findViewById(R.id.count);
    mCount = 0;
    tv.setText(getResources().getString(R.string.count) + ' ' + mCount);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mCount++;
    tv.setText(getResources().getString(R.string.count) + ' ' + count);
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
    mCount = savedInstanceState.getInt("count");
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("count", mCount);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

有关更多信息,请参阅和。

请参阅以检测方向更改我不想在此项目中使用方向更改事件,因为我正在使用布局焊盘和布局端口文件。我宁愿让Android来处理方向的改变。