স্টাইল.এক্সএমএলে কাস্টম বৈশিষ্ট্য


178

আমি একটি কাস্টম উইজেট তৈরি করেছি এবং আমি এটিকে লেআউট.এক্সএমএল হিসাবে ঘোষণা করছি। আমি এট্রেক্সএক্সএমএলে কিছু কাস্টম বৈশিষ্ট্যও যুক্ত করেছি। যাইহোক, শৈলীগুলিতে স্টাইলস.এক্সএমএলে এই বৈশিষ্ট্যগুলি ঘোষণার চেষ্টা করার সময়, এটি আমাকে দিচ্ছেNo resource found that matches the given name: attr 'custom:attribute'.

আমি করা আছে xmlns:custom="http://schemas.android.com/apk/res/com.my.package"styles.xml আপনাকে ট্যাগ করলে সহ সব <?xml>, <resources>এবং <style>, কিন্তু এটি এখনও আমাকে একই ভুল দেয়, এটি আমার কাস্টম এক্সএমএল নামস্থান খুঁজে পাচ্ছি না।

আমি যাইহোক, আমার লেআউট.এক্সএমএলটিতে ভিউটিতে অ্যান্ট্রিবিউটগুলি ম্যানুয়ালি অর্পণ করতে আমার নাম স্থানটি ব্যবহার করতে পারি, তাই নামের স্থানটিতে কোনও ভুল নেই। আমার ইস্যুটি স্টাইলস.এক্সএমএলকে আমার অ্যাটরেক্সএক্সএমএল সম্পর্কে সচেতন করতে।


1
cutsom:xmlns=...?? হওয়া উচিত নয় xmlns:cutsom=...?
সেলভিন

হ্যাঁ, যদিও আমি অনুলিপি / পেস্ট ধন্যবাদ ব্যবহার না করার জন্য
পেয়েছি

উত্তর:


362

আমি এটি খুঁজে বের! উত্তর হয় না শৈলী নামস্থান উল্লেখ করুন।

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>

13
ত্রুটিটি অদৃশ্য হয়ে যায়, তবে আমার দৃষ্টিভঙ্গিটি বিশিষ্ট মানটিকে গ্রহণ করে না, যখন এটি অন্যান্য (নন-কাস্টম) বৈশিষ্ট্যগুলিকে গ্রহণ করে। আমার বিশেষ বৈশিষ্ট্যটি একটি এনাম। উপরের স্নিপেটটি কি আপনার জন্য কাজ করছে?
পল ল্যামার্তসমা

@ পলল্যামার্টসমা আমি একটি এনাম ব্যবহার করছি এবং এটি আমার পক্ষে কাজ করবে বলে মনে হয় না। আপনার যদি কাস্টম নেমস্পেস এক্সএমএলএনস অ্যাট্রিবিউট না থাকে তবে আপনি আসলে আইটেমের নাম অ্যাট্রিবিউটটির জন্য আপনার পছন্দ মতো কোনও মান টাইপ করতে পারেন এবং এটি সংকলন করবে।
ডেভিড স্নাবেল-কাউন্ট

@ ডেভিডকন্ট আমি কার্যত যা কাজ করছি তা অবশেষে পেয়েছি । আমি শেষ পর্যন্ত declare-stylableএনুমের পরিবর্তে স্ট্রিং ব্যবহার করেছি । এনামরা কেন কাজ করছে না তা আমি নিশ্চিত নই, তবে এই কাজটি আমার পক্ষে যথেষ্ট ভাল ছিল।
পল ল্যামার্টসমা

3
এমনকি আমার জন্য কম্পাইল নয়, এপিআই Lvl 16 ব্যবহার
ডেভিড কুশলী ব্যক্তি বা ঘোড়া

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

43

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

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

মধ্যে ঘোষণা-styleable , নাম গুণ, একটি বর্গ নাম উল্লেখ করা তাই আমি একটি দৃশ্য বর্গ কল "com.my.package.name.VerticalView" থাকত, তাহলে প্রতিনিধিত্ব এই ঘোষণা VerticalView বা VerticalView এর উপশ্রেণী ব্যবহারের হতে হবে। সুতরাং আমরা এই জাতীয় শৈলী ঘোষণা করতে পারেন:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

এই কারণেই আমরা সম্পদ উপাদানগুলিতে নেমস্পেস ঘোষণা করি নি, এটি এখনও কার্যকর।


11

মান / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

মান / attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

মান / colors.xml

<resources>
    <color name="red">#f00</color>
</resources>

মান / dimens.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

ব্যবহার

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

এখানে চিত্র বর্ণনা লিখুন

ডেমো


10

স্টাইলার এবং ভিন্সের পরিবর্তন আমার পক্ষে কাজ করেছিল। আমি এটি উল্লেখ করতে চেয়েছিলাম যে @ ভিন্সের ব্যাখ্যা সম্পূর্ণ সঠিক নাও হতে পারে।

অনুমানটি পরীক্ষা করার declare-styleableজন্য যে কাস্টম ভিউ শ্রেণীর নামের সাথে মিলে যাওয়া নামের অ্যাট্রিবিউটটি আমাদের নামের স্থান ছাড়াই কাস্টম বৈশিষ্ট্যটি অ্যাক্সেস করার অনুমতি দিচ্ছে আমি এর নাম পরিবর্তন করেছি declare-styleable(কাস্টম ভিউটির নাম দেওয়া হয়েছিল TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

আমি তখন এটি obtainStyledAttributesপ্রতিফলিত করতে কাস্টম ভিউতে কলটি পরিবর্তন করেছি :

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

কোডটি এখনও চলছে ran সুতরাং আমি মনে করি না যে এটি ক্লাসটির declare-styleableনামানুসারে একরকম অন্তঃসংশোধন ।

সুতরাং আমি বিশ্বাস করি যে কোনও কাস্টম বৈশিষ্ট্য একটি নেমস্পেসের উল্লেখ না করে শৈলীর ঘোষণায় ব্যবহার করা যেতে পারে led

নির্বিশেষে, সমস্ত সহায়তা ছেলেদের জন্য ধন্যবাদ, এটি আমার সমস্যাটি সমাধান করেছে।


আসলে, বৈশিষ্ট্যগুলি একই নাম স্থানটি ভাগ করে, সেগুলি কোনও declare-styleableব্লকে ঘোষিত হয় বা না। (দুঃখিত, আমি এর জন্য রেফারেন্স পৃষ্ঠাটি খুঁজে পাই না ...) androidনেমস্পেসের গুণাবলী ব্যতীত আপনার কেবলমাত্র বৈশিষ্ট্যের নামটি নির্দেশ করা উচিত।
পিআর-শাদোকো

3
  • কিছু বৈশিষ্ট্য সংজ্ঞায়িত করুন

<declare-styleable name="refreshPullRefreshLayout">
        <attr name="refreshColors" format="reference"/>
        <attr name="refreshColor" format="reference"/>
</declare-styleable>
  • লেআউট ফাইল যেমন এটি ব্যবহার করুন

<com.aolphn.PullRefreshLayout
     app:refreshColor="@color/main_green"
     app:refreshColors="@array/refresh_color"/>
  • অবশেষে এটি স্টাইল ফাইলে ব্যবহার করুন

    স্টাইল ফাইল এবং লেআউট ফাইলের মধ্যে পার্থক্য হ'ল আমরা প্রিফিক্স যুক্ত করি না app:
<style name="refreshStyle">
    <item name="refreshColor">@color/main_green</item>
    <item name="refreshColors">@array/refresh_color</item>
</style>

এটি চেষ্টা করুন, একটি সুন্দর দিন দিন, এটি আমার জন্য কাজ করে।


2

যদি এটি অন্য কাউকে সহায়তা করে তবে আমার ভুলটি ছিল আমার কাস্টম ভিউ ক্লাসটি অ্যাট্রিবিউটসেট.সেটআট্রিবিউটভ্যালু উদাহরণ হিসাবে কল করছিল

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

... যার ফলস্বরূপ আমার কাস্টম দর্শনটির জন্য আমার কাস্টম অ্যাট্রিবিউটটি না পঠানো হয়েছিল।

সমাধানটি obtainStyledAttributesআমার কাস্টম ভিউতে ব্যবহার করা হয়েছিল:

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

এটি সঠিকভাবে কাজ করছে এমন একটি ইঙ্গিতটি R.styleable.MyTextViewStyleable_customFontহ'ল আপনি আপনার অ্যাটর্স.এক্সএমএল সংজ্ঞাতে সরাসরি যেতে Ctrl / Apple + এ ক্লিক করতে পারেন।

আমার কোড এবং অন্যান্য উদাহরণগুলির মধ্যে এই গুরুতর পার্থক্যটি সনাক্ত করতে আমার কিছুটা সময় লেগেছে, যেমন কাস্টম অ্যাট্রিবিউটটি সঠিকভাবে কাজ করেছিল যখন এক্সএমএল বিন্যাসের (সরাসরি একটি শৈলীর পরিবর্তে) সরাসরি পাস করার সময়।

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