【Android】savedInstanceState.getString方法为空!

问题解决:方法不是两个参数的onSaveInstanceState,而是onSaveInstanceState(outState: Bundle)


今天在做安卓实验遇到一个很坑的问题。
在安卓app做横屏竖屏旋转时,我们通常需要使用一个方法或者两个方法来保存数据状态:

  1. onSaveInstanceState()
  2. onRestoreInstanceState()

具体使用例子如下

override fun onSaveInstanceState(outState: Bundle) {

        var test = "jinondo is great!"
        outState.putString("aaa",test)
        super.onSaveInstanceState(outState)
    }

保存完状态用oncreate去取出数据

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if(savedInstanceState != null){
            var test = savedInstanceState?.getString("aaa")
            if (test != null) {
                Log.v("test",test)
            } 
        }
        //...
    }

或者使用 onRestoreInstanceState方法取出

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        val test = savedInstanceState.getString("aaa")
        if(test==null)
            Log.v("""test is null?""","test is null")
        else
            Log.v("test is null? N0", test.toString())
    }

但是!!!我总是获取不到那个String数据,一开始在网上博客找相关 onSaveInstanceState 的函数,发现都是 java 的代码,其实kotlin和java方法一个也差不多,然后就在kotlin打上函数名前几个字母,重要的是我直接代码补全了,
onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle)
多出了第二个参数,以为是和java略有不同,故沿用这个方法,但操作如痛只有一个参数的重载方法一样,一直不成功。其实就是方法错了,正确的只有一个参数,行吧记录一下踩坑经历 555
正确方法:
onSaveInstanceState(outState: Bundle)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
这个错误提示表明你在代码中将 RecyclerView 强制转换为 ListView,但是它们是不同的控件类型,所以无法转换。你需要修改代码,将 RecyclerView 与对应的 Adapter 进行绑定,而不是使用 ListView。 具体来说,你需要修改以下代码: ``` RecyclerView rvList = findViewById(R.id.rv_list); rvList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(RecyclerView recyclerView, View view, int i, long l) { ShowData item = (ShowData) recyclerView.getAdapter().getItemId(i); if (!isStarted) { modeDialog(item); } else { CustomToast.showLoad(MainActivity.this, getString(R.string.please_stop_read), 2000); } return true; } }); ``` 可以改为以下代码: ``` RecyclerView rvList = findViewById(R.id.rv_list); rvList.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { ShowData item = showDataList.get(position); if (!isStarted) { modeDialog(item); } else { CustomToast.showLoad(MainActivity.this, getString(R.string.please_stop_read), 2000); } return true; } }); adapter = new StockInListViewAdapter(this, showDataList); rvList.setAdapter(adapter); ``` 其中,OnItemLongClickListener 是 RecyclerView 的监听器,用于处理列表项的长按事件。在其中,我们通过 position 参数获取当前点击的列表项的位置,然后通过 showDataList.get(position) 获取对应的数据项。最后,我们使用 RecyclerView 的 setAdapter() 方法将 adapter 与 RecyclerView 绑定。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值