1

我正在制作一个演示应用程序来说明我如何处理屏幕方向。它是一个简单的计数器应用程序,当用户按下递增按钮时会递增计数,反之亦然。这是我的代码,我在清单文件中包含了 android:configChanges="keyboardHidden|orientation" 并且还覆盖了 onConfigurationChanged 方法。但不幸的是,我无法保留计数的值,当我将模拟器切换到横向时,计数重置为 0,我该如何解决这个问题?

public class Counter_demoActivity extends Activity {

int count=0;
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //UIActivity();
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    //UIActivity();
}
/*public void UIActivity(){
    this.tv=(TextView)this.findViewById(R.id.tv1);
    this.count=getChangingConfigurations();
}*/

}

我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.arif.counter_demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    >
    <activity
        android:label="@string/app_name"
        android:name=".Counter_demoActivity"
        android:configChanges="keyboardHidden|orientation|keyboard" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>
4

6 回答 6

3

为什么您在不需要这样做的情况下覆盖 onConfigurationChanged...在您的情况下。不要删除清单文件中的 android:configChanges="keyboardHidden|orientation" 只需删除代码

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
//UIActivity();
}

从您的项目中。清理并重建...

于 2011-11-22T05:56:45.850 回答
1

删除此方法

@Override
public void onConfigurationChanged(Configuration newConfig) {
      ....
}

并确保在清单中添加

android:configChanges="keyboardHidden|orientation"

使用 Counter_demoActivity 还是其他地方?

只需使用下面的行并检查您的活动是否正在重新创建?在创建方法的活动中记录一行,然后更改方向。行是否出现在 logcat 中?

android:configChanges="方向|键盘|keyboardHidden"

于 2011-11-22T05:57:29.740 回答
1

你没有说什么不起作用,但我会冒险猜测。你在某处得到一个空指针异常。您的代码的一个问题是您需要重复onCreate()执行时的大部分逻辑onConfigurationChanged。您在活动中有一组全新的视图。否则,成员字段tv将为空,并且不会有侦听器附加到您的按钮。

编辑根据您count未保留的评论,我认为您的清单有问题,系统正在破坏并重新创建您的方向更改活动。要保留count此类更改,请覆盖onRetainNonConfigurationInstance()以返回包含值的 Integer,并通过调用并将其强制转换为 Integer 来count访问该值。onCreate()getLastNonConfigurationInstance()

于 2011-11-22T05:58:19.833 回答
1

当我遇到同样的问题时,这是我在博客中发现的一个技巧。尝试一下

创建一个方法 getsavedstuff()

private void getsavedstuff() {
    Object mObject  = getLastNonConfigurationInstance();
}

并在 setContentView 之后立即使用

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getsavedstuff();
}
于 2011-11-22T06:02:50.480 回答
0

现在这是一个有意义的解决方案:)

public class Counter_demoActivity extends Activity {
final private static String COUNT_TITLE = "title";
private int restoredCount;
int count;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(COUNT_TITLE, count);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
     restoredCount =  savedInstanceState.getInt(COUNT_TITLE);
     count=restoredCount;
                 tv.setText("Your Count is " + restoredCount);
    super.onRestoreInstanceState(savedInstanceState);
}

}

于 2011-11-23T04:57:38.037 回答
0

问题是您在 onConfigurationChanged 中调用 setContentView。

如果您覆盖 onConfigurationChanged 并添加 android:configChanges="keyboard|keyboardHidden|orientation" 您的活动将不会被销毁和重新创建,而是会调用 onConfigurationChanged。如果你不实现它 super.onConfigurationChanged 被调用。超类的 config changed 方法将旋转您的布局,而不会从所有字段等中删除值。在您的情况下,布局会正确旋转,然后您自己通过调用重置布局setContentView(R.layout.main);

于 2011-11-23T12:14:56.097 回答