【问题标题】:Modify textView in a fragment from MainActivity using SharedPreferences (Kotlin)使用 SharedPreferences (Kotlin) 从 MainActivity 修改片段中的 textView
【发布时间】:2020-03-12 15:45:51
【问题描述】:

我对 Kotlin 中的一个项目有疑问。我需要修改片段中的文本视图,但我无法访问那些文本视图。 我收到的错误是:

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:

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


【解决方案1】:
import kotlinx.android.synthetic.main.activity_terms.*
import kotlinx.android.synthetic.main.fragment_settings.*

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

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

如果您的 Fragment 或您的 Activity 对其 xml 文件的引用(在 Activity 中设置内容视图或在片段中膨胀布局),您只能通过合成来控制视图

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

我想如果你把上面那行代码移到 Fragment 的onViewCreated 就可以解决问题了

【讨论】:

  • 感谢您的回答!我会尝试,如果有效,我会发短信给你!
【解决方案2】:

从主要活动的片段中调用 id TextView "emailSettingsText" 没问题。但是,你必须检查两件事:

  1. 使用“FragmentTransaction”在活动中设置片段。您可以使用此代码。
fun setFragment(fragmentManager: FragmentManager, fragmentString: String, fragment: Fragment, layout_fragment: Int) {
   val fragmentTransaction = fragmentManager.beginTransaction()
   fragmentManager.findFragmentByTag(fragmentString)
   fragmentTransaction.add(layout_fragment, fragment, fragmentString)
   fragmentTransaction.commit()
}
  1. 检查片段中的 id TextView。

我在“MainActivity”上检查了您的代码。你还没有在活动中设置你的片段。也许这就是导致您收到此类错误的原因。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多