gpt4 book ai didi

java - 当屏幕旋转时,用户可以欺骗 Android

转载 作者:行者123 更新时间:2023-11-29 21:04:26 26 4
gpt4 key购买 nike

我正在关注 Big Nerd Ranch 指南 Android,其中我正在构建一个显示一组问题的基本应用程序,你说对或错。有一个按钮“Cheat”,您可以在其中作弊。如果您点击按钮 Cheat 查看答案,返回并输入正确答案,然后会有一个 toast 显示“Cheating is wrong”。这在垂直屏幕上工作正常,但假设我将屏幕旋转到水平,我查看答案并返回水平,我可以作弊。我不希望发生这种情况。

我的努力:使用 onSavedInstanceState 覆盖现有函数以在屏幕之间共享值并跟踪 onCreate

中的值
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG, "onSaveInstanceState");
savedInstanceState.putBoolean(EXTRA_ANSWER_SHOWN, mAnswerIsTrue) ;
}

onCreate方法中,

if(savedInstanceState !=null)
{
mAnswerIsTrue = savedInstanceState.getBoolean(EXTRA_ANSWER_SHOWN);
setAnswerShownResult(mAnswerIsTrue);
}

这是我的代码:

package com.android.geoquiz;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class CheatActivity extends Activity
{
//Extras
public static final String EXTRA_ANSWER_IS_TRUE = "com.android.geoquiz.answer_is_true";
public static final String EXTRA_ANSWER_SHOWN = "com.android.geoquiz.answer_shown";

private static final String TAG="CheatActivity";
private static final String KEY_INDEX = "cheat";
private boolean mAnswerIsTrue;
private TextView mAnswerTextView;
private Button mShowAnswer;

private void setAnswerShownResult(boolean isAnswerShown)
{
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cheat);


mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);

mAnswerTextView = (TextView)findViewById(R.id.showAnswerButton);
setAnswerShownResult(false);
mShowAnswer = (Button)findViewById(R.id.showAnswerButton);
mShowAnswer.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if(mAnswerIsTrue)
{
mAnswerTextView.setText(R.string.true_button);
}
else
{
mAnswerTextView.setText(R.string.false_button);
}
setAnswerShownResult(true);
}
});



if(savedInstanceState !=null)
{

mAnswerIsTrue = savedInstanceState.getBoolean(KEY_INDEX, false);

}

}
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG, "onSaveInstanceState");
savedInstanceState.putBoolean(KEY_INDEX, mAnswerIsTrue) ;
}


@Override
public void onStart()
{
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
public void onPause()
{
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
public void onResume()
{
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
public void onStop()
{
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}

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


}

最佳答案

发生这种情况是因为一旦用户旋转屏幕就会调用您的 onCreate 有一个简单的解决方案可以阻止 onCreate 被调用 onOrientationChanged

<activity android:name=".MyActivity" 
android:configChanges="orientation|keyboardHidden" />

现在,当您执行此操作时,您必须覆盖 Activity 类中的一个方法,就像您拥有 onCreate 和 onPause 一样,您将需要添加另一个名为 onConfigChanged() 的方法;现在,只要您的屏幕旋转,就会触发此方法,而不是一次又一次地创建 Activity 。

将这个添加到你的 Activity 类中

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

希望这对您有所帮助。如果您需要任何帮助,请随时提出。

有关更多信息,请阅读这些帖子。

Activity restart on rotation Android

How do I disable orientation change on Android?

http://developer.android.com/guide/topics/manifest/activity-element.html#config

关于java - 当屏幕旋转时,用户可以欺骗 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com