এক্সএমএলে ডায়নামিক ভেরিয়েবলের সাথে সংস্থান থেকে স্ট্রিং সংযুক্ত করতে আমি কীভাবে ডেটাবাইন্ডিং ব্যবহার করব?


125

আমার কাছে একটি টেক্সটভিউ রয়েছে যার একটি হার্ডকোডযুক্ত স্ট্রিং রয়েছে এবং আমার একটি ডায়নামিক ভেরিয়েবল রয়েছে যা আমি এই স্ট্রিংয়ের শেষে রাখতে চাই। এটি আমার কোড:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp">
    <TextView
        android:id="@+id/PeopleName"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/Generic_Text"+"@{ Profile.name }" />


</LinearLayout>

আমি একটি সমস্যা আছে android:text="@string/Generic_Text"+"@{ Profile.name }"Generic_Textরাজ্যের তারপর "আমার নাম" Profile.nameগতিশীল এবং স্পষ্টত প্রোফাইল প্রোফাইল থেকে পরিবর্তন করে। আমি এটি চাই যাতে পুরো টেক্সটভিউ আউটপুটটি আমার নাম হ'ল । প্রোফাইল. name}} যেকোনো সাহায্যই অসাধারণ.


আপনি কি ডেটাবাইন্ডিং ব্যবহার করছেন?
ম্যালামিং

হ্যাঁ আমি ডেটাবাইন্ডিং ব্যবহার করছি
ইগনাসিও পেরেজ

আপনার বর্তমান জাভা কোড যুক্ত করুন দয়া করে।
16:25

উত্তর:


162

তুমি এটি করতে পারো:

android:text= "@{String.format(@string/Generic_Text, Profile.name)}"

আপনি যদি আপনার Generic_Textস্ট্রিংয়ের জন্য স্ট্রিং ফর্ম্যাটিং ব্যবহার করেন । প্রাক্তন। %sশেষে


অনেক ধন্যবাদ আমি কেবল এটি রেখেছি এবং এটি সঠিকভাবে কাজ করেছে
Ignacio পেরেজ

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, কারণ এটি পাঠ্যটি হস্তক্ষেপ করতে ডেটা বাইন্ডিং বৈশিষ্ট্যগুলি ব্যবহার করে না।
দারউইন্ড

1
@ দারউইন্ডের সাথে একমত, দয়া করে বাঁধাই অ্যাডাপ্টারের সাথে কাজ করার জন্য আমার উত্তরটি দেখুন
জুনিয়গুই

@ ইগোরগানাপলস্কি এই উত্তরটি 3 বছরেরও বেশি পুরনো হলেও স্পষ্টতই আগে কাজ করতেন - আপনি যখন চেষ্টা করেছিলেন তখন কি ভুল হয়েছিল মনে আছে?
C0D3LIC1OU5

320

আপনি এটি আরও সহজ করতে পারেন:

android:text= "@{@string/generic_text(profile.name)}"

আপনার স্ট্রিং এর মতো হওয়া উচিত:

<string name="generic_text">My Name is %s</string>

সম্পাদনা:

  1. অবশ্যই আপনি প্রয়োজন হিসাবে অনেক ভেরিয়েবল ব্যবহার করতে পারেন:

    android:text= "@{@string/generic_text(profile.firstName, profile.secondName)}"
    
    <string name="generic_text">My Name is %1$s %2$s</string>
  2. এটি কেবলমাত্র ডেটা বাইন্ডিংয়ে নকশাকৃত হওয়ার কারণে এটি কাজ করে। দস্তাবেজগুলিতে আরও: https://developer.android.com/topic/libraries/data-b ਬਾਈ্যান্ডিং / এক্সপ্রেসনস


1
তবে এটি দেখায় My Name is nullযদি ডেটা এখনও প্রস্তুত না হয় (উদাহরণস্বরূপ নেটওয়ার্ক থেকে লোড করা হয়নি)
user924

1
এই ক্ষেত্রে শুধু এটি আগে পরীক্ষা করে দেখুন। android:text= "@{profile == null ? @string/loading : @string/generic_text(profile.firstName, profile.secondName)}"
রোমান_ডি

এটি সহায়ক!
akash89

সেরা উত্তর :)
হেরিবার্তো রিভেরা

55

কনক্রিট স্ট্রিং করার অনেকগুলি উপায়

1. স্ট্রিং রিসোর্স ব্যবহার করা ( স্থানীয়করণের কারণে প্রস্তাবিত )

android:text= "@{@string/generic_name(user.name)}"

এই জাতীয় স্ট্রিং রিসোর্স তৈরি করুন।

<string name="generic_name">Hello %s</string>

2. হার্ড কোডেড কনক্যাট

android:text="@{`Hello ` + user.name}"/>

আপনার যখন ফোন নম্বরটির জন্য + হার্ডকডযুক্ত সংযোজন দরকার হয় তখন এটি কার্যকর হয়।

৩. Stringএর কনক্যাট পদ্ধতিটি ব্যবহার করা

android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"

এখানে spaceএকটি এইচটিএমএল সত্তা রয়েছে যা ভিতরে রাখা হয়েছে strings.xml। কারণ XMLসরাসরি এইচটিএমএল সত্তা বা বিশেষ অক্ষর গ্রহণ করে না। (এইচটিএমএল সত্তা লিঙ্ক করুন)

<string name="space">\u0020</string>

4. ব্যবহার String.format()

android:text= "@{String.format(@string/Hello, user.name)}"

এই ধরণের লেআউটে আপনার স্ট্রিং ক্লাসটি আমদানি করতে হবে।

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="String" />
    </data>
    <TextView
        android:text= "@{String.format(@string/Hello, user.name)}"
        ... >
    </TextView>
</layout>

5. স্ট্রিং রিসোর্স দ্বারা দুটি স্ট্রাক্ট কনক্যাট।

android:text="@{@string/generic_name(user.firstName,user.lastName)}"

এই ক্ষেত্রে একটি স্ট্রিং রিসোর্স রাখুন strings.xml

<string name="generic_name">%1$s, %2$s</string>

আরও অনেক উপায় থাকতে পারে, আপনার প্রয়োজনের একটি বেছে নিন।


5

একটি বাঁধাই অ্যাডাপ্টার ব্যবহার করুন ।

এই নমুনাটি কোটলিনে লিখিত এবং অ্যাকাউন্টে নেওয়া হয় যে সীমাটি পরিবর্তনশীল নাল হতে পারে:

@BindingAdapter("my_name")
fun TextView.setMyName(name: String?) {
    this.text =
        if (name.isNullOrEmpty()) "" else "${this.context.getString(R.string.Generic_Text)} $name"
}

তারপরে android:textসম্পত্তির পরিবর্তে আপনার এক্সএমএলে বাইন্ডিং অ্যাডাপ্টার ব্যবহার করুন

app:my_name="@{Profile.name}"

বাইন্ডিংয়ে আমদানি করা ফাংশনগুলি কল করতে অনেক সমস্যা হয়েছে, এই উত্তরটি আমার পক্ষে পুরোপুরি কাজ করে এবং আমার এক্সটেনশানগুলি পুনরায় ব্যবহার করতে দেয়। ধন্যবাদ!
ড্যানি বুওনোকোর

যেহেতু, মৌলিক ম্যানিপুলেশন ইতিমধ্যে Stringশ্রেণীর দ্বারা সরবরাহ করা হয়েছে xml, আপনার সমাধানের ভিত্তিতে এই সমাধানটি কেবল উন্নত স্ট্রিং ম্যানিপুলেশনের জন্য ব্যবহার করা ভাল। তবে এটি ভুল নয়।
Sud007

3

2019 আপডেট, অ্যান্ড্রয়েড স্টুডিও 3.4 এ, অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.4 এ

আর আমদানির দরকার নেই

<import type="java.lang.String" />" 

স্ট্রিং অপারেশন জন্য। দয়া করে এই উত্তরটি পরীক্ষা করুন ।


1

যদি আপনি শেষের দিকে সংস্থান করতে রিসোর্স স্ট্রিং পরিবর্তন করতে না পারেন%s (উদাহরণস্বরূপ এটি প্রত্যয় ছাড়া অন্য কোথাও ব্যবহৃত হয়):

android:text="@{@string/Generic_Text.concat(Profile.name)}"

যদি Profile.nameশূন্য না হতে পারে তবে যথেষ্ট। তবে, যদি nullঘটে থাকে তবে এটি ক্রাশ হবে'll আপনাকে অন্য স্তর যুক্ত করতে হবে:

android:text="@{@string/Generic_Text.concat(Objects.toString(Profile.name))}"

(যার জন্য <import type="java.util.Objects"/>কাজ করা দরকার ))

আবার: আপনার যদি অন্য কোথাও রিসোর্স স্ট্রিং ব্যবহার করে থাকে তবে এই সমস্ত অতিরিক্ত কাজটি মূল্যবান। দ্বিতীয় কারণটি হ'ল যখন আপনি null"নাল" আক্ষরিক পরিবর্তে "খালি স্ট্রিং" হিসাবে পরিচালনা করতে চান ।


2
যদি স্ট্রিং রিসোর্স অন্য কোথাও ব্যবহার করা হয় তবে কেন কেবল একটি নতুন সংস্থান তৈরি করবেন না?
জেরেট মিল্লার্ড

0

যদি আপনি করতে চান তাহলে লেখা টাইপ XML- এর ব্যবহার করতে পারেন ` উদ্ধৃতি।

android:text="@{`Device Name`}"

অন্য কোথাও আপনার স্ট্রিং বা ভেরিয়েবলের সাথে কনক্যাট করা দরকার , আপনি ব্যবহার করতে পারেন

android:text="@{`Device Name`.concat(android.os.Build.MANUFACTURER)}"

আপনি যদি ভেরিয়েবলের পরিবর্তে কনক্যাট স্ট্রিং রিসোর্স করতে চান তবে আপনি করতে পারেন,

android:text="@{@string/app_name.concat(`Device Name`)}"

0

কেবল +অপারেটর ব্যবহার করা আমার পক্ষে কাজ করে :

android:text= "@{@string/Generic_Text +' '+ Profile.name)}"

স্ট্রিং.এক্সএমএল হবে:

<string name="Generic_Text">Hello</string>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.