Làm cách nào để giữ khoảng trắng ở cuối và / hoặc ở đầu Chuỗi?


358

Tôi phải nối hai chuỗi này từ các tệp tài nguyên / giá trị của mình:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2"> flips !</string>

Tôi làm theo cách này:

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+total_flips+getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

Nhưng khoảng trắng ở cuối chuỗi thứ nhất và ở đầu chuỗi thứ hai đã biến mất (khi Toast được hiển thị) ...

Tôi nên làm gì ?

Tôi đoán câu trả lời là ở đâu đó trong liên kết tài liệu này

hoặc là một cái gì đó giống như sử dụng &amp ;cho ký tự "&" ??


2
Có một vài câu trả lời hay, nhưng không có câu trả lời nào phù hợp với tôi (xem bình luận của tôi). Tiền thưởng dành cho bất kỳ câu trả lời nào cung cấp cách lấy ký tự không gian thực (U + 0020) làm ký tự đầu tiên hoặc cuối cùng của tài nguyên chuỗi.
Thomas

3
Android khó chịu khó chịu :(
Vlad Spreys

Câu trả lời:


502

Ngay cả khi bạn sử dụng định dạng chuỗi, đôi khi bạn vẫn cần khoảng trắng ở đầu hoặc cuối chuỗi. Đối với những trường hợp này, không thoát với \, cũng không xml:spacegiúp thuộc tính. Bạn phải sử dụng thực thể HTML &#160;cho một khoảng trắng.

Sử dụng &#160;cho khoảng trắng không thể phá vỡ.
Sử dụng &#032;cho không gian thường xuyên.


12
Đây là loại công trình, nhưng nó chèn một không gian không phá vỡ (U + 00A0) thay vì một không gian thông thường. Điều đó có thể là không mong muốn trong một số tình huống.
Thomas

50
& # 160 không hoạt động ... Trình chỉnh sửa xml có lỗi và bạn không thể xây dựng dự án ... \ u0020 hoạt động tốt!
jcamacho

10
Bạn cần thêm dấu chấm phẩy (;) ở cuối.
1010160

36
\ u0020 nói chung là giải pháp tốt hơn. & # 032; yêu cầu bạn phân tích cú pháp html và có thể bị bỏ qua ngẫu nhiên trong một số trường hợp dẫn đến không có khoảng trống
HaydenKai

5
Trên Android Studio 3.2 triển khai lên trình giả lập API 25, tôi đã sử dụng &#032;và tôi không gặp lỗi xây dựng, nhưng không gian của tôi vẫn bị bỏ qua. &#160;đã làm việc, nhưng tôi không muốn một khoảng trắng không thể phá vỡ. Tôi muốn chỉ là một không gian thông thường. \u0020đã làm việc.
Heath

489

Tôi gặp vấn đề tương tự. Tôi muốn để trống ở cuối chuỗi tài nguyên đại diện cho tên trường trên màn hình.

Tôi đã tìm thấy giải pháp cho báo cáo vấn đề này: https://github.com/iBotPeaches/Apktool/issues/124

Đây là ý tưởng tương tự mà Duessi gợi ý. Chèn \u0020trực tiếp vào XML cho một khoảng trống bạn muốn giữ lại.

Thí dụ :

<string name="your_id">Score :\u0020</string>

Việc thay thế được thực hiện khi xây dựng, do đó nó sẽ không ảnh hưởng đến hiệu suất trò chơi của bạn.


làm việc tuyệt vời tự hỏi sự khác biệt giữa việc sử dụng nó và & # 160;
nhà phát triển Android

3
@androiddeveloper, \ u chỉ ra một ký tự unicode là một chuỗi thoát (không phải là một char unicode trực tiếp trong tệp). & # nnn; cho biết một thực thể html, có nghĩa là bạn đang dựa vào chuỗi xml của mình được phân tích cú pháp html (theo mặc định khi nó được sử dụng trong chế độ xem văn bản). Xem w3schools.com/html/html_entities.asp
greg7gkb

@ greg7gkb Thú vị, nhưng tôi không biết nó theo mặc định. Bạn có nghĩa là nếu tôi sử dụng "setText" trên tài nguyên chuỗi, nó sẽ hoạt động như nhau?
nhà phát triển Android

@androiddeveloper Vâng, tôi chỉ xác nhận điều này trong mã. Bạn có thể có các thực thể html trong tệp xml chuỗi của mình và chúng sẽ được chuyển đổi theo mặc định với setText (int resId). Ví dụ: <string name = "test"> T & # 160; S & # 160; T & # 160; </ string>.
greg7gkb

5
\u0020là KHÔNG GIAN của mã ASCII. Đây là sự lựa chọn tốt nhất cho dự án của tôi vì tôi phải chắc chắn rằng đó là ASCII.
OneWorld

138

Tài liệu này cho thấy trích dẫn sẽ hoạt động:

<string name="my_str_spaces">" Before and after? "</string>

2
Có đảm bảo không<string name="my_str_spaces">" Before <b>and</b> after? "</string>
Prateek

5
Thích điều này hơn là sử dụng các ký tự unicode! Cảm ơn!
Sumit Anantwar

2
Thật không may, một số công cụ bản địa hóa, như Passolo, tự động thêm dấu gạch chéo trước khi trích dẫn. Và chuỗi trở thành thế này: <string name = "my_str_spaces"> \ "Trước và sau? \" </ String>. Do đó, trích dẫn này xuất hiện trong văn bản. Vì vậy, sử dụng \ u0020 dường như tốt hơn trong trường hợp này.
Cáo

Tôi không thấy điều này được đề cập ở bất cứ đâu trong tài liệu. Gần nhất tôi có thể thấy là Enclose the entire string in double quotes ("This'll work", for example)nơi nó thảo luận về việc trốn thoát a Single quote (').
Heath

Điều này không hiệu quả với tôi
James Riordan

38

Tôi chỉ sử dụng mã UTF cho không gian "\ u0020" trong tệp String.xml.

<string name="some_string">\u0020The name of my string.\u0020\u0020</string>

làm việc tuyệt vời (Android yêu thích mã UTF)


2
Điều này làm việc cho tôi nơi câu trả lời được chấp nhận không.
Lance

1
Có bất cứ điều gì mới cho câu trả lời hiện có ?
user905686

21

Câu hỏi này có thể cũ, nhưng bây giờ cách dễ nhất để làm là thêm dấu ngoặc kép. Ví dụ:

<string name="Toast_Memory_GameWon_part1">"you found ALL PAIRS ! on "</string>
<string name="Toast_Memory_GameWon_part2">" flips !"</string>

Điều này hoạt động hoàn hảo. Chỉ cần bao quanh văn bản mong muốn của bạn với dấu quotaion "văn bản của bạn"
Tarun Kumar

10

Có thể không gian với chiều rộng khác nhau:

<string name="space_demo">|&#x20;|&#x2009;|&#x200A;||</string>

| KHÔNG GIAN | KHÔNG GIAN NÀY | KHÔNG GIAN TÓC | không có không gian |

Hình dung:

nhập mô tả hình ảnh ở đây


8

Nếu bạn thực sự muốn làm theo cách bạn đang làm thì tôi nghĩ bạn phải nói với nó rằng khoảng trắng có liên quan bằng cách thoát khỏi nó:

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on\ </string>
<string name="Toast_Memory_GameWon_part2">\ flips !</string>

Tuy nhiên, tôi sẽ sử dụng định dạng chuỗi cho việc này. Một cái gì đó như sau:

<string name="Toast_Memory_GameWon">you found ALL PAIRS ! on %d flips !</string>

sau đó

String message_all_pairs_found = String.format(getString(R.string.Toast_Memory_GameWon), total_flips);

1
Thoát với dấu gạch chéo ngược không hoạt động (ít nhất là đối với tôi). Sử dụng một chuỗi định dạng nói chung là một giải pháp tuyệt vời, nhưng không phải lúc nào cũng vậy. Chẳng hạn, String.formatgây ra nhiều phân bổ bộ nhớ không mong muốn trong một trò chơi.
Thomas

thoát khỏi khoảng trắng (sử dụng "\") cũng không hiệu quả với tôi.
nhà phát triển Android

Định dạng chỉ hoạt động nếu tất cả văn bản của bạn được hiển thị theo cùng một kiểu. Trong trường hợp của tôi, 2 thứ được nối là đậm so với màu bình thường và khác nhau.

5

sử dụng "" với giá trị tài nguyên chuỗi.

Ví dụ: "giá trị với khoảng trắng"

HOẶC LÀ

sử dụng mã \ u0020 cho không gian.


4

Hoạt động tốt Tôi đang sử dụng \ u0020

<string name="hi"> Hi \u0020 </string>
<string name="ten"> \u0020 out of 10  </string>
<string name="youHaveScored">\u0020 you have Scored \u0020</string>

Tệp Java

String finalScore = getString(R.string.hi) +name+ getString(R.string.youHaveScored)+score+ getString(R.string.ten);
               Toast.makeText(getApplicationContext(),finalScore,Toast.LENGTH_LONG).show();

Ảnh chụp màn hình ở đây Hình ảnh hiển thị Làm việc của mã này


2

Một đối số có thể được thực hiện để thêm không gian lập trình. Vì những trường hợp này sẽ thường được sử dụng trong việc ghép nối, tôi quyết định chấm dứt sự điên rồ và chỉ làm điều cũ + " " +. Những điều này sẽ có ý nghĩa trong hầu hết các ngôn ngữ châu Âu, tôi sẽ thu thập.


1

Tất cả các câu trả lời ở đây không làm việc cho tôi. Thay vào đó, để thêm một khoảng trắng ở cuối chuỗi trong XMLtôi đã làm điều này

<string name="more_store">more store<b> </b> </string>

0

Tôi không biết gì về Android nói riêng, nhưng điều này trông giống như việc xử lý khoảng trắng XML thông thường - khoảng trắng hàng đầu và dấu trong một phần tử thường được coi là không đáng kể và bị xóa. Hãy thử xml:space:

<string name="Toast_Memory_GameWon_part1" xml:space="preserve">you found ALL PAIRS ! on </string>
<string name="Toast_Memory_GameWon_part2" xml:space="preserve"> flips !</string>

Thật không may, xml:spacedường như bị bỏ qua.
Thomas

0

Điều này có thể không thực sự trả lời câu hỏi (Cách giữ khoảng trắng trong XML) nhưng nó có thể giải quyết vấn đề tiềm ẩn một cách duyên dáng hơn.

Thay vì chỉ dựa vào tài nguyên XML, hãy ghép nối bằng các chuỗi định dạng. Vì vậy, trước tiên hãy loại bỏ các khoảng trắng

<string name="Toast_Memory_GameWon_part1">you found ALL PAIRS ! on</string>
<string name="Toast_Memory_GameWon_part2">flips !</string>

Và sau đó xây dựng chuỗi của bạn khác nhau:

String message_all_pairs_found = 
      String.format(Locale.getDefault(), 
                    "%s %d %s", 
                    getString(R.string.Toast_Memory_GameWon_part1),
                    total_flips,
                    getString(R.string.Toast_Memory_GameWon_part2);

Toast.makeText(this, message_all_pairs_found, 1000).show();

0

Ngoài ra còn có giải pháp sử dụng CDATA. Thí dụ:

<string name="test"><![CDATA[Hello          world]]></string>

Nhưng nói chung tôi nghĩ \u0020là đủ tốt.


-1

Nếu bạn cần không gian cho mục đích kết nối nó với các chuỗi khác, thì bạn có thể sử dụng phương pháp định dạng chuỗi để thêm đối số vào định nghĩa chuỗi của mình:

<string name="error_">Error: %s</string>

Sau đó, để định dạng chuỗi (ví dụ: nếu bạn gặp lỗi do máy chủ trả về, nếu không thì sử dụng getString(R.string.string_resource_example)):

String message = context.getString(R.string.error_, "Server error message here")

Kết quả nào trong:

Error: Server error message here

-6

Nó không hoạt động với xml: space = "reserved"

vì vậy tôi đã làm nó một cách nhanh nhất =>

Tôi chỉ cần thêm + "" + vào nơi tôi cần ...

String message_all_pairs_found = getString(R.string.Toast_Memory_GameWon_part1)+" "+total_flips+" "+getString(R.string.Toast_Memory_GameWon_part2);

2
Điểm quan trọng của việc sử dụng tài nguyên là gì nếu bạn chỉ trộn lẫn trong một số chuỗi ký tự Java?
Kristopher Johnson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.