在Kotlin中在Fragment中使用Shared Preferences。

huangapple go评论146阅读模式
英文:

Shared Preferences in Fragment with Kotlin

问题

以下是您提供的代码翻译结果:

class HomeFragment : Fragment() {
    private lateinit var homeViewModel: HomeViewModel

    @SuppressLint("SetTextI18n")
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        /*homeViewModel =
                ViewModelProvider(this).get(HomeViewModel::class.java)*/
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        val textView: TextView = root.findViewById(R.id.text_home)
        val button: Button = root.findViewById<Button>(R.id.button)
        var nombre = PrefConfing.loadTotalFromPref(this)
        button.setOnClickListener {
            nombre++
            textView.text = "vous l'avez fait $nombre fois"
            PrefConfing.saveTotalTimes(requireContext(), nombre)
        }

        return root
    }
}

这是您的 Kotlin HomeFragment 代码,以下是您的 Java 代码:

public class PrefConfing {
    private static final String TIMES = "com.example.alllerrr";
    private static final String PREF_TOTAL_KEY = "pref_total_key";

    public static void saveTotalTimes(Context context, int total) {
        SharedPreferences pref = context.getSharedPreferences(TIMES, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt(PREF_TOTAL_KEY, total);
        editor.apply();
    }

    public static int loadTotalFromPref(Context context){
        SharedPreferences pref = context.getSharedPreferences(TIMES, Context.MODE_PRIVATE);
        return pref.getInt(PREF_TOTAL_KEY, 0);
    }
}

对于变量 nombre,您不能将其添加到上下文中,我理解不了为什么。

请注意,我已经根据您的要求,只返回了翻译好的部分。如果您有任何进一步的问题或需要解释,请随时提问。

英文:

I'm making a counter app in Android using Kotlin. My code is working great in MainActivity but when it comes to fragment it's not working anymore.

class HomeFragment : Fragment()
{
    private lateinit var homeViewModel: HomeViewModel

    @SuppressLint(&quot;SetTextI18n&quot;)
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View?
    {
        /*homeViewModel =
                ViewModelProvider(this).get(HomeViewModel::class.java)*/
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        val textView: TextView = root.findViewById(R.id.text_home)
        val button: Button = root.findViewById&lt;Button&gt;(R.id.button)
        var nombre = PrefConfing.loadTotalFromPref(this)
        button.setOnClickListener {
            nombre++
            textView.text = &quot;vous l&#39;avez fait $nombre fois&quot;
            PrefConfing.saveTotalTimes(applicationContext, nombre)
        }

        return root
    }
}

This is my Kotlin HomeFragment code, and there is my Java code:

public class PrefConfing {
    private static final String TIMES = &quot;com.example.alllerrr&quot;;
    private static final String PREF_TOTAL_KEY = &quot;pref_total_key&quot;;

    public static void saveTotalTimes(Context context, int total) {
        SharedPreferences pref = context.getSharedPreferences(TIMES, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt(PREF_TOTAL_KEY, total);
        editor.apply();
    }

    public static int loadTotalFromPref(Context context){
        SharedPreferences pref = context.getSharedPreferences(TIMES, Context.MODE_PRIVATE);
        return pref.getInt(PREF_TOTAL_KEY, 0);
    }
}

for the var nombre I can't add this to the context and I don't understand why.

答案1

得分: 1

Sure, here's the translated content:

如果在以下代码行中:

var nombre = PrefConfing.loadTotalFromPref(this)

出现以下错误:

类型不匹配。
需要:Context!
找到:HomeFragment

你需要像这样做:

var nombre = PrefConfing.loadTotalFromPref(requireContext())
英文:

If in line

var nombre = PrefConfing.loadTotalFromPref(this)

You are getting:

Type mismatch.
Required: Context!
Found: HomeFragment

You have to do it like this:

var nombre = PrefConfing.loadTotalFromPref(requireContext())

答案2

得分: 1

你会明白的:

如果你追踪 Activity 类的继承,你会发现它继承自 Context 类,所以传递 "this" 没有问题,
但是当你追踪 Fragment 类的继承(androidx.fragment.app.Fragment),你永远不会发现该类继承了 Context,所以不能将 "this" 作为 Context 来使用。

实际上,getContextrequireContext 返回它们所在宿主的上下文,所以你需要使用它们。

> requireContext:返回一个非空的 Context,如果没有可用的上下文会抛出异常。

> getContext:返回一个可为 null 的 Context。

在这里 了解更多关于 "getContext" 和 "requireContext" 之间区别的信息。

英文:

You'll know why:

If you chase inheritance of Activity class you'll find out that it inherits Context class so passing "this" has no problem,
But when you chase Fragment class inheritance (androidx.fragment.app.Fragment), you'll never find that class inherits Context, so it's not acceptable to pass "this" as Context.

Actually getContext and requireContext returns their host's context, so you need to use them instead.

> requireContext: returns a nonnull Context, or throws an exception when one isn't available.

> getContext: returns a nullable Context.

see more about difference between "getContext" and "requireContext".

huangapple
  • 本文由 发表于 2020年10月28日 04:27:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/64562404.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定