猿问

为什么对象在 RestoreInstanceState 上抛出 nullPointe

我的 android 应用程序中有一个 TextView 和 ImageButton 对象,它们在应用程序启动(onCreate)时正确显示,但是当调用 saveInstanceState() 和 RestoreInstanceState() 时,编译器会抛出 nullPointerException (即使它们的状态已正确加载)我尝试设置文本或任何与此相关的内容。我还有一些其他 ImageButtons 两次都正确显示(在第一次 onCreate 时,以及在调用 RestoreInstanceState 时),所以它让我更加困惑。

我曾尝试创建 TextView 的另一个实例,为其设置 Text,然后将该 TextView 设置为原始实例,但它不起作用。

public class MainActivity extends AppCompatActivity {

    private TextView score;

    private TextView labelPoints;

    private ImageButton finQuest;

    private int langFlag = 0;

    private PowerManager.WakeLock wakeLock;

    private int points = 0;

    private ListenerQuestionChooser lqc;

    //saving and loading the instanceState of the buttons bellow works perfectly

    private ImageButton btn1;

    private ImageButton btn2;

    private ImageButton btn3;

    private ImageButton btn4;

    private ImageButton btn5;

    private ImageButton btn6;


    @SuppressLint("InvalidWakeLockTag")

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);

        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");

        wakeLock.acquire();


        setContentView(R.layout.activity_main);


        labelPoints = findViewById(R.id.total_score);

        finQuest = findViewById(R.id.btn_finanswer);

        score = findViewById(R.id.text_points); 

        btn1 = findViewById(R.id.btn1);

        btn2 = findViewById(R.id.btn2);

        btn3 = findViewById(R.id.btn3);

        btn4 = findViewById(R.id.btn4);

        btn5 = findViewById(R.id.btn5);

        btn6 = findViewById(R.id.btn6);


        }

最终编辑:经过大约 16 个小时的头撞墙、尝试各种事情(逻辑和不逻辑的)并在每一步上打印日志,我解决了这个问题。所以这就是解决方案(我仍然不明白为什么其他对象在没有这个的情况下可以完美工作,而这些对象需要它,但是嘿,只要它有效,我就会接受它)。


LEATH
浏览 117回答 2
2回答

至尊宝的传说

经过大约 16 个小时的头撞墙、尝试各种事情(逻辑和不逻辑的)并在每一步打印日志之后,我解决了这个问题。所以这就是解决方案(我仍然不明白为什么其他对象在没有这个的情况下可以完美工作,而这些对象需要它,但是嘿,只要它有效,我就会接受它)。if (lqc == null) {    lqc = new ListenerQuestionChooser(this, this);}if (savedInstanceState != null) {    this.loadSettings(savedInstanceState);}if (finQuest == null) {    try {        finQuest = findViewById(R.id.btn_finansfer);        finQuest.setOnClickListener(lqc);        if (ListenerQuestionChooser.getCorrectAnswer() > 0) {            finQuest.setVisibility(View.VISIBLE);        } else {            finQuest.setVisibility(View.INVISIBLE);        }    } catch (Exception e) {        e.printStackTrace();    }}if (labelPoints == null) {    labelPoints = findViewById(R.id.total_score);    score = findViewById(R.id.text_points);    try {        ss = new StringSetter(this);        if (getLangFlag() == 0) {            labelPoints.setVisibility(View.INVISIBLE);            score.setVisibility(View.INVISIBLE);        } else {            score.setText(String.valueOf(getPoints()));            labelPoints.setText(ss.podesiPromenljivu(brPoena, getLanguage()));        }    } catch (Exception e) {        e.printStackTrace();    }}

侃侃无极

这显然不是完整的来源,所以我们只能猜测。看起来您第一次创建此活动时 langFlag 设置为 0。从捆绑包中读取它后,它必须是一个不同的值,因为您进入了 else 块。我们不知道 getPoints 是什么 - 它只在您获得 NPE 的地方提到一次。因此,看起来 getPoints 为 null,但我们无法从您附加的代码中看出原因。
随时随地看视频慕课网APP

相关分类

Java
我要回答