- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
过去几个月我一直在通过 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
将 %s 添加回 Strings.XML 上的 xliff
最佳答案
您应该熟悉 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/
我是一名优秀的程序员,十分优秀!