কাস্টম দেখার জন্য attrs.xML এ একই নামযুক্ত বৈশিষ্ট্য


179

আমি কয়েকটি কাস্টম দর্শন লিখছি যা কিছু একই-নামযুক্ত বৈশিষ্ট্যগুলি ভাগ করে। আমি তাদের নিজ নিজ <declare-styleable>বিভাগে attrs.xmlগুণাবলীর জন্য একই নামগুলি ব্যবহার করতে চাই:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView1">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>
</resources>

আমি এটি বলতে ত্রুটি পাচ্ছি myattr1এবং myattr2এটি ইতিমধ্যে সংজ্ঞায়িত। আমি খুঁজে পেয়েছি যে আমার formatজন্য myattr1এবং এর myattr2মধ্যে বৈশিষ্ট্যটি বাদ দেওয়া উচিত MyView2, তবে আমি যদি এটি করি তবে আমি কনসোলে নিম্নলিখিত ত্রুটিটি পেয়েছি:

[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute 

আমি কীভাবে এটি সম্পাদন করতে পারি এমন কোনও উপায় আছে, সম্ভবত কোনওরকম নেমস্পেসিং (কেবল অনুমান করা)?

উত্তর:


401

সমাধান: উভয় মতামত থেকে সাধারণ বৈশিষ্ট্যগুলি সরান এবং এগুলি সরাসরি <resources>নোডের শিশু হিসাবে যুক্ত করুন :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myattr1" format="string" />
    <attr name="myattr2" format="dimension" />

    <declare-styleable name="MyView1">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>
</resources>

11
যখন myattr1স্ট্রিং ইন MyView1এবং পূর্ণসংখ্যা হয় তখন কী হয় MyView2?
foxx1337

4
আমি এটি মনে করি না, উদাহরণস্বরূপ আমাদের 'ওরিয়েন্টেশন' বৈশিষ্ট্য থাকতে পারে এবং কিছু দৃষ্টির জন্য এটি 'অনুভূমিক' / 'উল্লম্ব' এবং অন্যান্য 'ল্যান্ডস্কেপ' / 'প্রতিকৃতি' / 'স্কোয়ার'। আমার দৃষ্টিকোণ থেকে এটি অ্যান্ড্রয়েডে একটি বাগ (বা কমপক্ষে অসামঞ্জস্যপূর্ণ আচরণ) (মনে রাখবেন: 1. স্টাইলযোগ্য বৈশিষ্ট্যগুলি সর্বদা উপসর্গ = দেখুন নাম এবং 2 দিয়ে শুরু হয় যদি আপনি এই জাতীয় দর্শনের জন্য পৃথক গ্রন্থাগার প্রকল্প তৈরি করেন তবে সবকিছু ঠিকঠাক কাজ করবে) )
se.solovyev

4
আমি যখন এই উত্তরটি অনুসরণ করি তখন আমি ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr যে সমস্ত দৃষ্টির জন্য ঘোষনা করার চেষ্টা করি তার জন্য আমি পাই। কোন ধারনা?
Dapp

45
@ গুগল: ক্রেপি ডিজাইন
গ্লেন বেক

6
@ foxx1337 শুধু ব্যবহার করুন <attr name="myattr1" format="string|integer" />। আমার জন্য কাজ কর.
মাইগড

57

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

  <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <!-- parent styleable -->
     <declare-styleable name="MyView">
         <attr name="myattr1" format="string" />
         <attr name="myattr2" format="dimension" />
     </declare-styleable>

     <!-- inheriting parent styleable -->
     <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
    <declare-styleable name="MyView1" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myBackgroundColor" format="color"/>
    </declare-styleable>


    <!-- inheriting parent styleable -->
    <!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
    <declare-styleable name="MyView2" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myfont" format="string"/>
        ...
    </declare-styleable>
</resources>

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


1
এটি আমার পক্ষে কাজ করেছে। আমি গৃহীত উত্তর থেকে কোডে নিষ্কাশিত বৈশিষ্ট্যগুলি রেফারেন্স করার কোনও উপায় খুঁজে পাই না।
নেমানজা কোভেসেভিক

হুম..এই অদ্ভুত .. গ্রহণযোগ্য সমাধানটি আমার পক্ষে ভালভাবে কাজ করছে বলে মনে হচ্ছে (টার্গেটএসডিপি ভার্সন 27)। হতে পারে কারণ "পাঠ্য" এর মতো বৈশিষ্ট্যগুলি সাধারণ এবং অন্য কোনও attrs.xML এ বিদ্যমান থাকতে পারে ..?
আবা

আমি এমন একটি নাম দিয়ে চেষ্টা করেছি যা সম্ভবত অস্বাভাবিক এবং গ্রহণযোগ্য সমাধানটি এখনও আমার পক্ষে কাজ করেছে।
আবা

আমি প্রথম মন্তব্য সঙ্গে একমত! টাইপড অ্যারে থেকে নিষ্কাশিত অ্যাটরকে রেফারেন্স দেওয়ার কোনও উপায় নেই। অতএব আপনাকে স্টাইলযোগ্য পিতামাতার সংজ্ঞা দেওয়া দরকার
23

এটি কাজ করার জন্য সন্তানের মধ্যে নয় পিতামাতায় এবং এই বৈশিষ্ট্যটি সম্বোধন করতে ভুলবেন না (শ্রেণীর MyView2অধিকারের জন্য R.styleable.MyView2_myattr1R.styleable.MyView_myattr1
:,

27

প্রিয়া সিংহলের উত্তর হিসাবে, অ্যান্ড্রয়েড স্টুডিওর সাধারণ বৈশিষ্ট্যগুলির নামগুলি তাদের নিজস্ব শৈলীর নামের মধ্যে সংজ্ঞায়িত করা প্রয়োজন। তারা আর মূলে থাকতে পারে না।

যাইহোক, লক্ষ্য করার মতো আরও কয়েকটি জিনিস রয়েছে (যার কারণে আমি একটি উত্তরও যোগ করছি):

  • সাধারণ শৈলীর ভিউ হিসাবে একই জিনিসটির নামকরণ করার দরকার নেই। ( এটি উল্লেখ করার জন্য এই উত্তরের জন্য ধন্যবাদ ।)
  • পিতামাতার সাথে আপনার উত্তরাধিকার ব্যবহার করার দরকার নেই।

উদাহরণ

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

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- common attributes to all custom text based views -->

    <declare-styleable name="TextAttributes">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <!-- custom text views -->

    <declare-styleable name="View1">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

প্রবাহিত উদাহরণ

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

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="View1">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

একটি বৃহত প্রকল্পের জন্য, যদিও এটি অগোছালো হয়ে উঠতে পারে এবং একক লোকেশনে শীর্ষে তাদের সংজ্ঞা দেওয়া আরও ভাল হতে পারে ( এখানে প্রস্তাবিত হিসাবে )।


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

@ সামিস, আমি এটির জন্য কিছুক্ষণ কাজ করি নি, তবে আমি ব্যবহারে কোনও ভুল জানি না parent। আমি মনে করি আমি কেবল বলছিলাম এটির প্রয়োজন ছিল না।
সুরগাচ

এটি প্রয়োজন হয় না, আমি কেবলমাত্র একটি অতিরিক্ত সাবটিক্সের চারপাশে মোড়ানো অন্য একটি সাবক্লাস তৈরি করেছি যা আমি বেস শ্রেণিতে রাখতে চাইনি। আমি বিচ্ছেদটি নির্দেশ করতে কেবল মন্তব্য এবং নামকরণের কনভেনশন ব্যবহার করছি।
সমিস

7

ধন্যবাদ লুইস আমারও একই সমস্যা ছিল এবং আপনার উত্তরাধিকারের সমাধানটি নীচের মতো করে দেওয়ার জন্য আমাকে ইঙ্গিত দিয়েছিল এবং এটি দুর্দান্ত কাজ করে I আমি কেবল উপরের দিকে সাধারণ বৈশিষ্ট্যগুলি ঘোষণা করেছি এবং বিন্যাস ছাড়াই আবার স্টাইলের ঘোষণার অংশে এটি আবার লিখি। আমি আশা করি এটি কাউকে সাহায্য করবে

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes -->
     <attr name="myattr1" format="string" />
     <attr name="myattr2" format="dimension" />

 <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" >
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myBackgroundColor" format="color"/>
</declare-styleable>

<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myfont" format="string"/>
    ...
</declare-styleable>


1

সহজলভ্য সমাধানের চেষ্টা করার পরেও কেউ যদি এই সমস্যার সাথে আটকে থাকে। আমি বিন্যাসের সাথে অ্যাড subtitleঅ্যাট্রিবিউট দিয়ে stringআটকেছি।

আমার সমাধান বিন্যাস অপসারণ করা হয়।

আগে:

<attr name="subtitle" format="string"/>

পরে:

<attr name="subtitle"/>

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