วิธีการอ่านค่าจาก string.xml ใน Android


368

ฉันเขียนบรรทัด:

String Mess = R.string.mess_1 ;

เพื่อรับค่าสตริง แต่แทนที่จะส่งคืนสตริงจะให้ ID ของจำนวนเต็มชนิด ฉันจะรับค่าสตริงได้อย่างไร ฉันพูดถึงค่าสตริงในstring.xmlไฟล์

คำตอบ:


807

ลองสิ่งนี้

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

UPDATE

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

คุณสามารถใช้อย่างใดอย่างหนึ่งgetString(int)หรือgetText(int)เพื่อดึงสตริง getText(int)จะคงรูปแบบ Rich Text ใด ๆ ที่ใช้กับสตริง

การอ้างอิง: https://developer.android.com/guide/topics/resources/string-resource.html


87
คุณสามารถทำให้มันง่ายขึ้นthis.getString(R.string.some_id)หากคุณอยู่ในContext(กิจกรรมหรือบริการ)
Matthias

ฉันใช้สิ่งนี้: ข้อความ String + = getResources (). getString (R.string.string1) + "คำอื่น ๆ ... "; และฉันต้องการที่จะส่งสายนี้ผ่านทาง SMS แต่มันไม่ทำงาน มันทำงานได้ดีโดยไม่มีทรัพยากรสตริง ฉันพลาดอะไรไปรึเปล่า?
keybee

9
คุณสามารถทำให้มันง่ายขึ้นยิ่งกว่านั้นที่จะ getString (R.string.some_id) และถ้าคุณต้องการปรับแต่งสตริงคุณสามารถสร้างสตริงแบบ "Welcome,% 1 $ s" ได้จากนั้นคุณสามารถใช้ getString (R.string.some_id, "John Doe") เพื่อรับ "Welcome, John Doe" ที่ runtime
M Granja

ใช้ได้กับประเภทอื่น ๆ เช่นฉันเพิ่งใช้getResouces().getInteger(R.integer.my_value_in_xml)
Noah Herron

61

ในกิจกรรม:

this.getString(R.string.resource_name)

ถ้าไม่ได้อยู่ในกิจกรรม แต่มีการเข้าถึงบริบท:

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

3
คุณไม่ต้องรวมthisขณะที่คุณอยู่ในกิจกรรม เพียงแค่getString()ให้คุณทำสิ่งต่าง ๆ
CopsOnRoad

43

ฉันใช้สิ่งนี้:

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

10
คำเตือน - ตามคำตอบนี้อ้างถึงเอกสารประกอบของ Android การใช้Resources.getSystem()ไม่ได้ให้ทรัพยากรแอปพลิเคชันแก่คุณ แต่เป็นเพียงหุ่นยนต์ stringมันไม่ควรจะใช้สำหรับทรัพยากรเช่น ฉันใช้วิธีแก้ปัญหานี้และแอปพลิเคชันขัดข้องโดยการขว้างnotfoundexceptionที่เข้าใจยาก (เนื่องจากมีทรัพยากรอยู่strings.xml)
et_l

ลองเช่นกัน - ไม่ทำงาน ดีเกินกว่าที่จะเป็นจริง
:)

23

อย่างไรก็ตามมันเป็นไปได้ที่จะสร้างอาร์เรย์สตริงใน strings.xml ดังนี้:

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

จากกิจกรรมของคุณคุณจะได้รับข้อมูลอ้างอิงเช่น:

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

คำตอบนี้ควรจะอยู่ที่นั่นส่วนใหญ่แล้วคุณกำลังอ่านอาร์เรย์จาก XML ไม่ใช่สตริงเดี่ยว
Ojonugwa Jude Ochalifu


6

โซลูชันที่ 1

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

โซลูชันที่ 2

String mess = getString(R.string.mess_1)


3

หากคุณต้องการเพิ่มค่าสตริงลงในปุ่มตัวอย่างเช่นใช้งานง่าย

android:text="@string/NameOfTheString"

ข้อความที่กำหนดในstrings.xmlมีลักษณะดังนี้:

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

2

คุณต้องอ้างอิงชื่อบริบทก่อนใช้getResources()ใน Android

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

หรือ

Context mcontext=getApplicationContext();

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

1

คุณสามารถใช้รหัสนี้:

 gettext (R.string.mess_1); 

โดยทั่วไปคุณจะต้องส่งรหัสทรัพยากรเป็นพารามิเตอร์ไปยังวิธีการ getText ()


1

หากคุณอยู่ในกิจกรรมที่คุณสามารถใช้

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

หากคุณไม่ได้อยู่ในกิจกรรมให้ใช้สิ่งนี้:

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

1

รายละเอียด

  • Android Studio 3.1.4
  • รุ่น Kotlin: 1.2.60

งาน

  • ใช้บรรทัดเดียว
  • รหัสขั้นต่ำ
  • ใช้คำแนะนำจากคอมไพเลอร์

ขั้นตอน 1. แอปพลิเคชัน ()

รับลิงก์ไปยังบริบทของแอปพลิเคชันของคุณ

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()
    }

}

ขั้นตอนที่ 2 เพิ่มส่วนขยาย int

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

การใช้

strings.xml

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

รับค่าสตริง:

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

ผล

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


1

Rขณะที่ยูเขียน คุณอ้างถึงR.javaคลาสที่สร้างโดย eclipse ใช้getResources().getString()และส่งผ่านidทรัพยากรที่คุณพยายามอ่านภายในgetString()เมธอด

ตัวอย่าง: String[] yourStringArray = getResources().getStringArray(R.array.Your_array);



0

ปรับปรุง

  • คุณสามารถใช้getString(R.string.some_string_id)ทั้งActivityหรือFragmentหรือ
  • คุณสามารถใช้Context.getString(R.string.some_string_id)ที่คุณไม่ได้มีการเข้าถึงโดยตรงgetString()วิธี กดDialogไลค์

ปัญหาคือที่ที่คุณไม่Contextสามารถเข้าถึงได้เช่นเดียวกับวิธีการในของคุณUtilชั้นเรียน

สมมติวิธีด้านล่างโดยไม่มีบริบท

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

ตอนนี้คุณจะผ่านContextเป็นพารามิเตอร์ในวิธีนี้และใช้getString().

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

สิ่งที่ฉันทำคือ

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

อะไร? มันง่ายมากที่จะใช้ทุกที่ในแอปของคุณ!

ดังนั้นนี่คือโบนัสที่ไม่ซ้ำกันแก้ปัญหา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;
    }

}

เพิ่มฟิลด์ชื่อในmanifest.xml <applicationแท็กของคุณ

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

ตอนนี้คุณก็พร้อมแล้ว



0

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

ตอนนี้สตริงของคุณจะถูกคัดลอกไปยัง myString ฉันหวังว่ามันจะทำงานให้คุณ


0

คุณสามารถอ่านค่าที่กำหนดโดยตรงใน strings.xml โดยตรง:

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

และตั้งเป็นตัวแปร:

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

แต่เราสามารถกำหนดสตริงลงในมุมมอง:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello"/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.