jak odczytać wartość z string.xml w Androidzie?


368

Napisałem wiersz:

String Mess = R.string.mess_1 ;

aby uzyskać wartość ciągu, ale zamiast zwracać ciąg, podaje mi identyfikator typu liczba całkowita. Jak mogę uzyskać wartość ciągu? Wspomniałem o wartości ciągu w string.xmlpliku.

Odpowiedzi:


807

Spróbuj tego

String mess = getResources().getString(R.string.mess_1);

AKTUALIZACJA

String string = getString(R.string.hello);

Możesz użyć albo getString(int)albo, getText(int)aby pobrać ciąg. getText(int)zachowa wszelkie style tekstu sformatowanego zastosowane do łańcucha.

Odniesienie: https://developer.android.com/guide/topics/resources/string-resource.html


87
możesz to uprościć, this.getString(R.string.some_id)jeśli jesteś już w Context(działalność lub usługa).
Matthias

Użyłem tego: komunikat string + = getResources (). GetString (R.string.string1) + „więcej słów…”; i chciałem wysłać ten ciąg przez SMS, ale to nie działa. Działa dobrze bez zasobu ciągów. Czy coś brakuje?
keybee

9
Możesz uprościć to jeszcze bardziej, aby uzyskać getString (R.string.some_id). A jeśli chcesz dostosować ciąg, możesz utworzyć ciąg podobny do „Witamy,% 1 $ s”, a następnie możesz użyć getString (R.string.some_id, „John Doe”). aby uzyskać „Welcome, John Doe” w czasie wykonywania.
M Granja,

Działa również dla innych typów, które właśnie użyłemgetResouces().getInteger(R.integer.my_value_in_xml)
Noah Herron

61

W działaniu:

this.getString(R.string.resource_name)

Jeśli nie jest aktywny, ale ma dostęp do kontekstu:

context.getString(R.string.resource_name)
application.getString(R.string.resource_name)

3
Nie musisz uwzględniać thispodczas aktywności. Po prostu getString()pozwoli ci robić różne rzeczy.
CopsOnRoad

43

Używam tego:

String URL = Resources.getSystem().getString(R.string.mess_1);

10
Ostrzeżenie - zgodnie z tą odpowiedzią cytując dokumentację Androida, korzystanie Resources.getSystem()nie daje zasobów aplikacji, ale tylko zasoby Androida. Nie należy go używać do takich zasobów string. Użyłem tego rozwiązania i aplikacja notfoundexceptionuległa awarii, powodując, że było to trudne do zrozumienia (ponieważ zasób istnieje strings.xml).
et_l

próbowałem też - NIE działa. zbyt piękne, aby
mogło

23

Nawiasem mówiąc, możliwe jest również tworzenie tablic ciągów w pliku strings.xml w następujący sposób:

<string-array name="tabs_names"> 
    <item>My Tab 1</item> 
    <item>My Tab 2</item>
</string-array>

A następnie z działania możesz uzyskać takie odniesienie:

String[] tab_names = getResources().getStringArray(R.array.tab_names);
String tabname1=tab_names[0];//"My Tab 1"

Ta odpowiedź powinna tam być. W większości przypadków czytasz tablice z XMLa, a nie pojedynczych ciągów.
Ojonugwa Jude Ochalifu

11

Tylko dla przyszłych odniesień.

W dokumentacji zasobów String napisano:

Do pobrania ciągu można użyć getString (int) lub getText (int). getText (int) zachowa wszelkie style tekstu sformatowanego zastosowane do łańcucha.


6

Rozwiązanie 1

Context context;
String mess = context.getString(R.string.mess_1)

Rozwiązanie 2

String mess = getString(R.string.mess_1)

3

Fragmentami możesz użyć

getActivity().getString(R.id.whatever);

3

Jeśli chcesz na przykład dodać wartość ciągu do przycisku, wystarczy użyć

android:text="@string/NameOfTheString"

Zdefiniowany tekst w strings.xml wygląda następująco:

 <string name="NameOfTheString">Test string</string>

2

Przed użyciem getResources()w systemie Android musisz odwołać się do nazwy kontekstu .

String user=getApplicationContext().getResources().getString(R.string.muser);

LUB

Context mcontext=getApplicationContext();

String user=mcontext.getResources().getString(R.string.muser);

1

Możesz użyć tego kodu:

 getText (R.string.mess_1); 

Zasadniczo musisz przekazać identyfikator zasobu jako parametr do metody getText ().


1

Jeśli prowadzisz działalność, możesz jej użyć

getResources().getString(R.string.whatever_string_youWant);

Jeśli nie jesteś w działaniu, użyj tego:

getApplicationContext.getResource().getString(R.String.Whatever_String_you_want)

1

Detale

  • Android Studio 3.1.4
  • Wersja Kotlin: 1.2.60

Zadanie

  • użycie pojedynczej linii
  • minimalny kod
  • użyj sugestii kompilatora

Krok 1. Aplikacja ()

Uzyskaj link do kontekstu twojej aplikacji

class MY_APPLICATION_NAME: Application() {

    companion object {
        private lateinit var instance: MY_APPLICATION_NAME

        fun getAppContext(): Context = instance.applicationContext
    }

    override fun onCreate() {
        instance = this
        super.onCreate()
    }

}

Krok 2. Dodaj rozszerzenie int

inline fun Int.toLocalizedString(): String = MY_APPLICATION_NAME.getAppContext().resources.getString(this)

Stosowanie

strings.xml

<resources>
    <!-- .......  -->
    <string name="no_internet_connection">No internet connection</string>
    <!-- .......  -->
</resources>

Uzyskaj wartość ciągu:

val errorMessage = R.string.no_internet_connection.toLocalizedString()

Wyniki

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


1

podczas gdy ty piszesz R. masz na myśli R.javaklasę utworzoną przez eclipse, użyj getResources().getString()i przekaż idzasób, z którego próbujesz odczytać wewnątrz getString()metody.

Przykład: String[] yourStringArray = getResources().getStringArray(R.array.Your_array);


0

**

Mam nadzieję, że ten kod będzie korzystny

**

String user = getResources().getString(R.string.muser); 

0

Aktualizacja

  • Możesz użyć getString(R.string.some_string_id)w obu Activitylub Fragment.
  • Możesz użyć Context.getString(R.string.some_string_id), gdy nie masz bezpośredniego dostępu do getString()metody. Jak Dialog.

Problem polega na tym, że nie masz Contextdostępu , jak metoda w Utilklasie.

Załóżmy poniższą metodę bez kontekstu.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

Teraz przejdziesz Contextjako parametr w tej metodzie i użyjeszgetString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

To co robię jest

public void someMethod(){
    ...
    App.getRes().getString(R.string.some_id)
}

Co? Jest bardzo prosty w użyciu w dowolnym miejscu w aplikacji!

Oto wyjątkowe rozwiązanie premiowe, dzięki któremu można uzyskać dostęp do zasobów z dowolnego miejsca Util class.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

Dodaj pole nazwy do manifest.xml <applicationtagu.

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Teraz możesz już iść.



0

String myString = getResources().getString(R.string.here_your_string_name);

Teraz twój ciąg jest kopiowany do myString. Mam nadzieję, że ci się uda.


0

Możesz bezpośrednio odczytać wartość zdefiniowaną w strings.xml:

<resources>
    <string name="hello">Hello StackOverflow!</string>
</resources>

i ustaw na zmienną:

String mymessage = getString(R.string.hello);

ale możemy zdefiniować ciąg do widoku:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello"/>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.