使用SharedPreferences(Kotlin)从MainActivity修改片段中的textView

问题描述 投票:0回答:3

我在Kotlin的一个项目有问题。我需要修改片段中的textView,但无法访问这些textView。我收到的错误是:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.example/com.example.example.MainActivity}: java.lang.IllegalStateException: emailSettingsText must not be null

在我的MainActivity(片段所在的位置)中,我尝试了此操作:

emailSettingsText.text = sharedPreferences.getString("EMAIL", "")

我也尝试在我的主要活动中创建一个变量:

var = emailVar = sharedPreferences.getString("EMAIL", "")

但是我不能更改片段中的文本。

这是片段:

package com.example.example.ui.settings

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.example.example.R
import kotlinx.android.synthetic.main.activity_terms.*
import kotlinx.android.synthetic.main.fragment_settings.*


@Suppress("DEPRECATION")
class SettingsFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {

        ViewModelProviders.of(this).get(SettingsViewModel::class.java)




        return inflater.inflate(R.layout.fragment_settings, container, false)
    }

}

是否有任何方法可以更改片段中名为emailShowSettingsText的textView?感谢您的帮助。

这是我的活动代码:

package com.example.example

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.widget.TextView
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupWithNavController
import com.example.example.ui.settings.SettingsFragment
import kotlinx.android.synthetic.main.fragment_settings.*
import kotlinx.android.synthetic.main.fragment_settings.view.*
import kotlinx.android.synthetic.main.fragment_traffic.*

class MainActivity : AppCompatActivity(), Communicator {

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

        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        val sharedPreferences = getSharedPreferences("TOKEN_FILE", Context.MODE_PRIVATE)

        val navController = findNavController(R.id.nav_host_fragment)

        var dominioVal = sharedPreferences.getString("DOMINIO", "")

        AppBarConfiguration(
            setOf(
                R.id.navigation_traffic, R.id.navigation_ipblocked, R.id.navigation_search_terms, R.id.navigation_settings
            )
        )

        navView.setupWithNavController(navController)
    }


}
android android-fragments kotlin android-activity fragment
3个回答
0
投票
import kotlinx.android.synthetic.main.activity_terms.*
import kotlinx.android.synthetic.main.fragment_settings.*

您在一个Activity中导入了2个合成xml文件,这里有些问题,

似乎emailSettingsText属于Fragment,但您尝试在Activity中调用它。

如果片段或您的Activity对其xml文件的引用(在Activity中为setContentView或在片段中为inflate布局,则您只能通过合成控件来控制视图)

emailSettingsText.text = sharedPreferences.getString("EMAIL", "")

我认为如果将上面的代码行移动到Fragment onViewCreated,问题将会解决。>


0
投票

您可以从主要活动中的片段中将id称为TextView“ emailSettingsText”。但是,您必须检查两件事:


0
投票

最后,我使用伴随对象解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.