অ্যান্ড্রয়েড এক্সএমএল লেআউট'র কি ট্যাগ অন্তর্ভুক্ত রয়েছে?


84

আমার অ্যান্ড্রয়েড লেআউট ফাইলগুলিতে <অন্তর্ভুক্ত> ব্যবহার করার সময় আমি বৈশিষ্ট্যগুলিকে ওভাররাইড করতে অক্ষম। আমি যখন বাগগুলি অনুসন্ধান করেছি, তখন আমি প্রত্যাখাত সমস্যা 2863 পেয়েছি :

"অন্তর্ভুক্ত ট্যাগটি ভাঙ্গা হয়েছে (ওভাররাইডিং লেআউট প্যারামগুলি কখনই কাজ করে না)"

যেহেতু রোমেন পরীক্ষার স্যুটগুলিতে এবং তার উদাহরণগুলিতে এটি কাজ করে তা নির্দেশ করে, তাই আমি অবশ্যই কিছু ভুল করছি।

আমার প্রকল্পটি এইভাবে সংগঠিত হয়েছে:

res/layout
  buttons.xml

res/layout-land
  receipt.xml

res/layout-port
  receipt.xml

বোতাম.এক্সএমএলে এরকম কিছু রয়েছে:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

  <Button .../>

  <Button .../>
</LinearLayout>

এবং প্রতিকৃতি এবং ল্যান্ডস্কেপ রসিদ.এক্সএমএল ফাইলগুলি দেখতে এমন কিছু দেখায়:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

  ...

  <!-- Overridden attributes never work. Nor do attributes like
       the red background, which is specified here. -->
  <include
      android:id="@+id/buttons_override"
      android:background="#ff0000"
      android:layout_width="fill_parent"
      layout="@layout/buttons"/>

</LinearLayout>

আমি কী মিস করছি?


আপনি যখন সমর্থিত নয় এমন কোনও উপায়ে অন্তর্ভুক্ত করার জন্য এই প্রশ্নটি অ্যান্ড্রয়েড বিকাশকারী সরঞ্জামগুলির দ্বারা উল্লেখ করা হয়।
টমাস ডাব্লু

উত্তর:


132

আমি সবেমাত্র বিষয়টি খুঁজে পেয়েছি। প্রথমত, আপনি কেবল লেআউট_ * বৈশিষ্ট্যগুলিকে ওভাররাইড করতে পারেন, তাই পটভূমিটি কাজ করবে না। এটি ডকুমেন্টেড আচরণ এবং কেবল আমার পক্ষ থেকে একটি তদারকি।

আসল সমস্যাটি লেআউটআইনফ্লেটার.জভাতে পাওয়া গেছে:

// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
// During a layoutparams generation, a runtime exception is thrown
// if either layout_width or layout_height is missing. We catch
// this exception and set localParams accordingly: true means we
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
try {
   params = group.generateLayoutParams(attrs);
} catch (RuntimeException e) {
   params = group.generateLayoutParams(childAttrs);
} finally {
   if (params != null) {
     view.setLayoutParams(params);
   }
}

যদি <অন্তর্ভুক্ত> ট্যাগে লেআউট_উইথ এবং লেআউট_উইট উভয়ই অন্তর্ভুক্ত না থাকে, রানটাইম এক্সেকশনটি ঘটে এবং নিঃশব্দে পরিচালনা করা হয়, এমনকি কোনও লগ বিবৃতি ছাড়াই।

সমাধানটি সর্বদা লেআউট_উইথ এবং লেআউট_ উভয়ই অন্তর্ভুক্ত করা <<অন্তর্ভুক্ত> ট্যাগটি ব্যবহার করার সময়, যদি আপনি কোনও লেআউট_ * বৈশিষ্ট্যকে ওভাররাইড করতে চান তবে।

আমার উদাহরণটিতে পরিবর্তিত হওয়া উচিত:

<include
      android:id="@+id/buttons_override"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      layout="@layout/buttons"/>

33
এটি হাস্যকর। আমি কখনই এটি কাজ করতে সক্ষম হইনি, এবং এমনকি ডকুমেন্টেশনগুলির উচ্চতা এবং প্রস্থ উভয়ই প্রয়োজনের প্রয়োজন দেখেছি যা মাত্রা ওভাররাইড করার চেষ্টা করছে, যা আমি ধরে নিয়েছিলাম উচ্চতা এবং প্রস্থ ছিল। যাইহোক, আমি সমস্ত ওভাররাইড করার চেষ্টা করেছিলাম তা মার্জিন, যা আসলে কোনও মাত্রা নয়। আমি যে সমস্ত পরিবর্তন করতে চাইছি তা লেআউট_মার্জনাইট রাইট হ'ল কেন আমাকে সেই দুটি বা এমনকি যে কোনও একটি নির্দিষ্ট করতে হবে? গ্রার, অ্যান্ড্রয়েড, কখনও কখনও আপনি আমাকে খুব হতাশ করেন।
আর্টেম রাশাকোভস্কিই

4
এফওয়াইআই অ্যান্ড্রয়েড লিন্ট আপনাকে একটি ত্রুটি দেয় (লেআউট প্যারামিটার লেআউট_উইথটি উপেক্ষা করা হয় যদি না লেআউট_উইথ <অন্তর্ভুক্ত> ট্যাগের উপরেও নির্দিষ্ট না করা থাকে) আপনি যদি উচ্চতা এবং প্রস্থ উভয় বৈশিষ্ট্যকেই উপেক্ষা না করে থাকেন
বাইনারি

10

সমস্ত অন্তর্ভুক্ত বৈশিষ্ট্যগুলিকে ওভাররাইড করার অনুমতি দেওয়ার জন্য আমি একটি বর্ধিতকরণের অনুরোধ জমা দিয়েছি :

ধরুন আমার TextViewক্ষেত্রের মান ব্যতীত দুটি অভিন্ন লেআউট আছে । বর্তমানে, আমি হয় রানটাইমের সময় লেআউটটি পরিবর্তন করেছি বা এক্সএমএলটি সদৃশ করব।

উদাহরণস্বরূপ "হ্যালো" এবং "ওয়ার্ল্ড" লেআউট 1 এ দুটি পরামিতি পাস করার জন্য:

<include layout="@layout/layout1a" params="textView=hello|editText=world" />

বিন্যাস 1a.xML:

<merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>

একটি বিকল্প বাস্তবায়ন এনক্যাপসুলেশন ভেঙে দেয় এবং অন্তর্ভুক্ত বিবৃতিটিকে এই জাতীয় মানগুলিকে ওভাররাইড করার অনুমতি দেয়:

<include layout="@layout/layout1b" overrides="@id/textView.text=hello|@id/editText.hint=world" />

লেআউট1 বি.এক্সএমএল:

<merge><TextView id="@+id/textView"><EditText hint="@+id/editText"></merge>


4
নতুন ডাটাবেইন্ডিং স্টাফটি বিবেচনায় নিয়ে <include>এখন আরও বেশি ব্যবহৃত হয় , অ্যাটর ওভাররাইডিংয়ের অবশ্যই একটি বৈশিষ্ট্য থাকতে হবে
দিমিত্রি গ্রায়াজিন

1

আমি কখনও কখনও অ্যাল্রয়েডে জিইউআই বিল্ডার ব্যবহার করার সময় অ্যান্ড্রয়েড: আইডি ট্যাগ সহ আমি কখনও কখনও মিস করি। বিল্ডারের কাছ থেকে আমি কোনও টেক্সটভিউতে যুক্ত করেছি তা নিশ্চিত করে (যখন আমি লক্ষ্য করব), আমি ID আইডিটি তালিকাভিউ বিন্যাসে ব্যবহার করছি।

<TextView android:text="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

হয়ে যায়

<TextView android:id="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

'মিথ্যা' 'মিথ্যা' পাওয়ার পরিবর্তে আমি পেয়েছি :) এবং ঠিক আছে কাজ করা অন্তর্ভুক্ত।

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