Приложение Multingual для Android в kotlin с сообщением: системные службы недоступны для Activity до onCreate () - PullRequest
0 голосов
/ 14 сентября 2018

Я пытался сделать многоязычное приложение в Android, следуя этому руководству: https://www.youtube.com/watch?v=ywF-ySiBAsc

Я использую kotlin при разработке приложения, и я столкнулся с некоторой ошибкой, которую я до сих пор не смог обработать.

вот app_intro Activity:

package com.xr.mapbased
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.widget.Button
import android.widget.TextView
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper
import uk.co.chrisjenx.calligraphy.CalligraphyConfig
import android.content.DialogInterface
import android.media.VolumeShaper
import com.google.android.gms.stats.WakeLock
import java.util.*
import android.content.res.Configuration
import android.content.res.Resources
import android.preference.PreferenceManager
import android.view.Menu
import android.view.MenuItem
import com.climaxwares.mapbased.helper.LocaleHelper


class app_intro : AppCompatActivity() {

var btnSingIn: Button? = null
var btnRegister:Button? = null
var btnChangeLang:TextView? = null
var LocaleAttach:   LocaleHelper? = null

override fun attachBaseContext(newBase: Context) {
    super.attachBaseContext(LocaleAttach?.onAttach(newBase,"en"))
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    CalligraphyConfig.initDefault(CalligraphyConfig.Builder()
            .setDefaultFontPath("fonts/Roboto-medium.ttf")
            .setFontAttrId(R.attr.fontPath)
            .build()
    )
    val getLang = PreferenceManager.getDefaultSharedPreferences(baseContext)
    setContentView(R.layout.activity_app_intro)
    btnRegister = findViewById(R.id.RegisterBtn) as Button
    btnSingIn = findViewById(R.id.SignInBtn) as Button
    btnChangeLang = findViewById(R.id.change_lang) as TextView

    val Language: String = getLang.getString("language","ar")
    if(Language == null)
        getLang.edit().putString("language","en")

    updateView("ar")


}

private fun updateView(Language: String) {
    val context: Context = LocaleAttach!!.setLocale(this,Language)
    val resources: Resources = context.getResources();

    btnSingIn!!.text = resources.getString(R.string.sign_in)
}

override fun onCreateOptionsMenu(menu: Menu): Boolean{
    menuInflater.inflate(R.menu.lang_menu,menu)
    return true
}

override fun onOptionsItemSelected(menuItem: MenuItem?): Boolean {
    val getLang = PreferenceManager.getDefaultSharedPreferences(baseContext)
    if(menuItem!!.getItemId() == R.id.language_en){
        getLang.edit().putString("language","en")
        updateView("en")
    }


    if(menuItem.getItemId() == R.id.language_ar){
        getLang.edit().putString("language","ar")
        updateView("ar")
    }
    return true
}
}

и я получаю следующие ошибки:

E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.climaxwares.mapbased,PID: 10816 java.lang.RuntimeException: Невозможно запустить действие. ComponentInfo {com.climaxwares.mapbased / com.climaxwares.mapbased.app_intro}: java.lang.IllegalStateException: системные службы недоступны для операций до onCreate () в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2377) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429) в android.app.ActivityThread.access $ 800 (ActivityThread.java:151) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1342) на android.os.Handler.dispatchMessage (Handler.java:110) на android.os.Looper.loop (Looper.java:193) в android.app.ActivityThread.main (ActivityThread.java:5333) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:515) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:829) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:645) в dalvik.system.NativeStart.main (собственный метод)Вызывается: java.lang.IllegalStateException: системные службы недоступны для операций перед onCreate () в android.app.Activity.getSystemService (Activity.java:4595) в android.view.LayoutInflater.from (LayoutInflater.java:211) вcom.android.internal.policy.impl.PhoneWindow. (PhoneWindow.java:289) на com.android.internal.policy.impl.Policy.makeNewWindow (Policy.java:61) на com.android.internal.policy.PolicyManager.makeNewWindow (PolicyManager.java:57) в android.app.Activity.attach (Activity.java:5253) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2308) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429) в android.app.ActivityThread.access $ 800 (ActivityThread.java:151) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1342) в android.os.Handler.dispatchMessage (Handler.java:110) на android.os.Looper.loop (Looper.java:193) на android.app.ActivityThread.main (ActivityThread.java:5333) на java.lang.reflect.Method.invokeNative (собственный метод)в java.lang.reflect.Method.invoke (Method.java:515) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:829) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main (собственный метод)

Я буду здесь для дальнейших вопросов, спасибо заранее:)

1 Ответ

0 голосов
/ 15 сентября 2018

у нас нет статических методов в Котлине?!

в этом была проблема, она была в самом файле адаптера, а не в MainActivity.

поэтому, когда я пытался позвонить в класс, это дало мне вышеуказанную ошибку. Я нашел этот урок очень полезным.

https://android.jlelse.eu/daily-kotlin-static-methods-9330552cde8a

хотя я сделал файл адаптера в Java более прямым в разработке.

вот код адаптера:

package com.xr.mapbased.helper;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.*;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.os.Build;

import com.google.android.gms.stats.WakeLock;

import java.util.Locale;


public class LocaleJ {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context){
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context,lang);
}

public static Context onAttach(Context context,String defaultLanguage){
    String lang = getPersistedData(context,defaultLanguage);
    return setLocale(context,lang);
}

private static String getPersistedData(Context context, String lang) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE,lang);
}

private static void persist(Context context, String language) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = pref.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();
}

public static Context setLocale(Context context, String lang) {
    persist(context,lang);
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        return updateResources(context,lang);

    return updateResourcesLegacy(context,lang);
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String lang) {
    Locale locale = new Locale(lang);
    Locale.setDefault(locale);

    Configuration config = context.getResources().getConfiguration();
    config.setLocale(locale);
    config.setLayoutDirection(locale);

    return context.createConfigurationContext(config);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String lang) {
    Locale locale = new Locale(lang);
    Locale.setDefault(locale);

    Resources resources = context.getResources();
    Configuration config = resources.getConfiguration();
    config.locale = locale;

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
        config.setLayoutDirection(locale);

    resources.updateConfiguration(config,resources.getDisplayMetrics());
    return context;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...