gpt4 book ai didi

java - 为什么除非我在 strings.XML 中添加 XML 占位符,否则我的方法不会显示该值?安卓开发

转载 作者:行者123 更新时间:2023-12-01 10:33:09 25 4
gpt4 key购买 nike

过去几个月我一直在通过 Udacity 研究 Android 开发,遇到了一个奇怪的问题,这个问题没有得到很好的解释,希望我能得到一些见解。抱歉,我不知道所有 Java 术语,所以请耐心等待。

当我将所有字符串添加到 strings.XML 文件时,我遇到了问题。我正在研究支持不同语言的设置。我浏览了 xliff 的一些文档,该部分用于识别您不想翻译的字符串部分。 %s(占位符?)部分是我没有经验的部分,它似乎改变了我编写 java 代码的方式。

这是我为这个问题制作的应用程序的代码。

这是我的 strings.xml,我注释掉了 xliff:g,它改变了我的 java 代码的行为,稍后我将对此进行解释

    <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">Test Application</string>

<!--store customer name is string here to be used later-->
<string name="order_summary_name">customer name is: <!--<xliff:g id="name" example="Amy">%s</xliff:g>--></string>
</resources>

Activity_Main.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.android.testapplication.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test Display Customer Name" />

<EditText
android:id="@+id/customer_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Name"/>

<TextView
android:id="@+id/display_name_here"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />

<Button
android:id="@+id/display_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Text"
android:onClick="submitText"/>
</LinearLayout>

MainActivity.Java

package com.example.android.testapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


//Display Message Method

private void displayMessage(String message) {
TextView displayTextView = (TextView) findViewById(R.id.display_name_here);
displayTextView.setText(message);
}

//Submit Text Method

public void submitText (View view) {
EditText editViewCustomerName = (EditText) findViewById(R.id.customer_name);
String customerName = editViewCustomerName.getText().toString();

String customMessage = createOrderSummary(customerName);
displayMessage(customMessage);
}

//Create order summary that only has the customer name

private String createOrderSummary(String addCustomerName) {
String orderMessage = getString(R.string.order_summary_name, addCustomerName);
return orderMessage;
}
}

这是我正在使用的字符串,当我单击“显示文本”时,该字符串会在我的手机上显示客户的姓名。这是老师让我们写出来的,但没有解释你可以用逗号分隔 R.id 字符串,然后调用 addCustomerName 来显示你输入的名称。

教师代码更改与我的不同

String orderMessage = getString(R.string.order_summary_name, addCustomerName);

这是我以前的方式并且有效。这是我的代码 fragment

String orderMessage = getString(R.string.order_summary_name) + addCustomerName;

然而,这就是我真正感到困惑的地方。如果我在 Strings.XML 文件中注释掉我的 xliff(就像我已经有它一样),我就无法使用教师代码来用逗号分隔字符串和 addCustomerName 并将其保留在括号内。我必须像上面那样连接它。

我四处寻找,因为我是新手,所以我不知道要寻找什么。我发现的唯一一件事是删除 %s(这是一个 XML 占位符?),它在使用讲师代码时会被破坏。但是当我把它放回去时它可以工作吗?

如果有人能解释这一点,我们将不胜感激。我已经被这个问题困扰好几天了。

以下是使用讲师代码时在我的设备上的一些屏幕截图。

从 Strings.XML 上的 xliff 中删除了 %s

Not displaying

将 %s 添加回 Strings.XML 上的 xliff

Now it works

最佳答案

您应该熟悉 http://developer.android.com/guide/topics/resources/string-resource.html

如果字符串中有占位符,则 getString 将根据 getString 的第二个、第三个……参数中的值替换它们。另一方面,即使您给出一个参数,如果字符串中没有占位符,它也不知道将其放在哪里。

格式解释如下:https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html

至于您在评论中提出的问题:

“格式字符串”中的占位符数量(即 R.string.order_summary_name)和 getString 的参数数量必须匹配(参数必须是占位符数量+1,因为显然第一个参数是格式字符串本身)。如果占位符较少,那么这可能不是问题,您只是看不到在字符串中渲染的最后传递的参数,但如果占位符比参数多,那么它甚至可能会抛出异常。

关于java - 为什么除非我在 strings.XML 中添加 XML 占位符,否则我的方法不会显示该值?安卓开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com