প্রাক ললিপপ ক্র্যাশে অ্যান্ড্রয়েড ভেক্টর ড্রয়াবল ব্যবহার করা


95

ললিপপের আগে আমি অ্যান্ড্রয়েডে ভেক্টর ড্রয়াবল ব্যবহার করছি এবং এগুলি আমার কয়েকটি গ্রন্থাগার এবং সরঞ্জাম সংস্করণগুলির মধ্যে রয়েছে:

  • অ্যান্ড্রয়েড স্টুডিও: 2.0
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইন: ২.০.০
  • বিল্ড সরঞ্জাম: 23.0.2
  • অ্যান্ড্রয়েড সমর্থন লাইব্রেরি: 23.3.0

আমি আমার অ্যাপ স্তরে এই সম্পত্তি যুক্ত করেছি Build.Gradle

android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

এছাড়া মূল্য উল্লেখ করার যে আমি LayerDrawable (layer_list) হিসেবে অ্যান্ড্রয়েড অফিসিয়াল ব্লগ (বিবৃত হিসাবে ব্যবহার একটি অতিরিক্ত অঙ্কনযোগ্য যেমন এখানে লিঙ্ক বাইরে ভেক্টর অঙ্কনযোগ্য জন্য অঙ্কনযোগ্য সেট করার জন্য)app:srcCompat

<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/search"/>
</level-list>

আপনি অ্যাপের বাইরে সরাসরি রেফারেন্সিং ভেক্টর ড্রয়াবলগুলি খুঁজে পাবেন: srcCompat ললিপপের আগে ব্যর্থ হবে। যাইহোক, অ্যাপকম্প্যাট ভেক্টর ড্রয়যোগ্য লোডিং সমর্থন করে যখন সেগুলি অন্য কোনও অঙ্কনযোগ্য পাত্রে যেমন স্টেটলিস্টড্রেবল, ইনসেটড্রেবল, লেয়ারড্রাব্যাবল, লেভেললিস্টড্রেবল এবং রোটেটড্রেবল হিসাবে উল্লেখ করা হয়। এই ব্যবহারের অপ্রত্যক্ষ্যতার drawableLeft অ্যাট্রিবিউট, যা স্বাভাবিকভাবে সমর্থন ভেক্টর অঙ্কনযোগ্য করতে সক্ষম হবে না: আপনি এই ধরনের TextView এর Android যেমন ক্ষেত্রেই ভেক্টর অঙ্কনযোগ্য ব্যবহার করতে পারেন।

আমি যখন app:srcCompatসমস্ত কিছু ব্যবহার করি ঠিকঠাক হয় তবে আমি যখন ব্যবহার করি:

android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

উপর ImageView, ImageButton, TextViewবা EditTextLollipop এ পূর্বে, এটি একটি প্রত্যাশা ছোঁড়ার:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9


কীভাবে আঁকো লেফট, অঙ্কনযোগ্য রাইট, অঙ্কনযোগ্য টপ, অঙ্কনযোগ্য নীচে ভেক্টরড্রেবেবল ব্যবহার করবেন তা দেখতে এই উত্তরটি দেখুন
বেহজাদ বাহমনিয়র

আপনি আমার উত্তর এখানে পরীক্ষা করতে পারেন? stackoverflow.com/a/40523623/2557258
Yazon2006

আমার ক্ষেত্রে, vactor অঙ্কনযোগ্য অধিকার প্যাকেজ (খোলা প্রকল্পের দৃশ্য) মূল উত্তর এখানে ছিল না stackoverflow.com/a/35836318/2163045
murt

উত্তর:


104

সর্বশেষ আপডেট - জুন / 2019

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

পিএনজি জেনারেশন

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

আমি এই অ্যাপ্লিকেশনটিতে এই সমাধানটি ব্যবহার করছি এবং ভাল কাজ করে। কোনও অতিরিক্ত বিল্ড . gradle পতাকা প্রয়োজন। কোন হ্যাক প্রয়োজন। আপনি যদি / বিল্ড / জেনারেট / রেজ / পিএনজি / তে যান ... আপনি সমস্ত উত্পন্ন পিএনজি দেখতে পাবেন can

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

সমর্থন লাইব্রেরি

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

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

এক্সএমএল উপাদানটির একটি উপসেট সমর্থন করে এমন "অটো-পিএনজি প্রজন্ম" থেকে আলাদা, এই সমাধানটি সমস্ত এক্সএমএল ট্যাগকে সমর্থন করে। সুতরাং, আপনার ভেক্টর আঁকতে সম্পূর্ণ সমর্থন have

এটি সমর্থন করার জন্য আপনাকে অবশ্যই প্রথমে আপনার বিল্ড.gradle আপডেট করতে হবে:

android {
  defaultConfig {
    // This flag will also prevents Android Studio from generating PNGs automatically
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
  // Use this for Support Library
  implementation 'com.android.support:appcompat-v7:23.2.0' // OR HIGHER

  // Use this for AndroidX
  implementation 'androidx.appcompat:appcompat:1.1.0' // OR HIGHER
}

এবং তারপরে, লোড করার সময় app:srcCompatপরিবর্তে ব্যবহার করুন । এটা ভুলে যাবেন নাandroid:srcVectorDrawables

আপনি TextViewযদি androidxসমর্থন লাইব্রেরির সংস্করণ ব্যবহার করে থাকেন তবে আপনি app:drawableLeftCompatপরিবর্তে (বা ডানদিকে, উপরে, নীচে) ব্যবহার করতে পারেনapp:drawableLeft

CheckBox/ এর ক্ষেত্রে এর পরিবর্তে RadioButtonব্যবহার app:buttonCompatকরুন android:button

আপনি যদি androidxসাপোর্ট লাইব্রেরির সংস্করণটি ব্যবহার না করে থাকেন এবং আপনার minSdkVersionহয় 17বা তার বেশি বা একটি বোতাম ব্যবহার করছেন না তবে আপনি প্রোগ্রামের মাধ্যমে সেট করার চেষ্টা করতে পারেন

Drawable icon = AppCompatResources.getDrawable(context, <drawable_id>);
textView.setCompoundDrawablesWithIntrinsicBounds(<leftIcon>,<topIcon>,<rightIcon>,<bottomIcon>);

আপডেট - জুলাই / 2016

তারা সেই ভেক্টর ড্র্যাবলকে অ্যান্ড্রয়েড সমর্থন লাইব্রেরিতে 23.4.0 এ পুনরায় সক্ষম
করেছে

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

হতে পারে , build.gradleসেটিংস এখন অপ্রচলিত এবং আপনার কেবল এটি যথাযথ ক্রিয়াকলাপগুলিতে সক্ষম করা প্রয়োজন (তবে, এটি পরীক্ষা করা প্রয়োজন)।

এখন, এটি সক্ষম করতে, আপনার অবশ্যই করতে হবে:

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    ...
}

আসল উত্তর - এপ্রিল / ২০১।

আমি মনে করি এটি ঘটছে কারণ সাপোর্ট ভেক্টর সর্বশেষতম পাঠাগার সংস্করণে অক্ষম ছিল: 23.3.0

এই পোস্টের মতে :

অ্যাপকম্প্যাট ব্যবহারকারীদের জন্য, আমরা কার্যকারিতাটি সরিয়ে নেওয়ার সিদ্ধান্ত নিয়েছি যা সংস্করণ ২৩.২.০ / ২৩.২.১ (ISSUE 205236) এ প্রয়োগের ক্ষেত্রে পাওয়া সমস্যার কারণে প্রাক-লোলিপপ ডিভাইসে সংস্থান থেকে ভেক্টর ড্রয়াবল ব্যবহার করতে দেয় । অ্যাপ্লিকেশন ব্যবহার করে: srcCompat এবং setImageResource () কাজ চালিয়ে যাচ্ছে।

আপনি যদি সমস্যা 205236 ইস্যুটি দেখে যান তবে মনে হয় তারা ভবিষ্যতে সক্ষম করবে তবে মেমরির সমস্যাটি শীঘ্রই ঠিক করা হবে না:

পরবর্তী প্রকাশে আমি একটি অপ্ট-ইন এপিআই যুক্ত করেছি যেখানে আপনি সরিয়ে নেওয়া ভেক্টরড্রেবল সমর্থনটিকে পুনরায় সক্ষম করতে পারবেন। এটি আগের মতো একই ক্যাভেটসের সাথে আসে (মেমরির ব্যবহার এবং কনফিগারেশন আপডেট করার ক্ষেত্রে সমস্যা)।

আমারও একি দশা. সুতরাং, আমার ক্ষেত্রে, আমি সমস্ত আইকনগুলিকে পুনরায় ফিরিয়ে দিয়েছি যা পুনরায় সংস্থান থেকে পিএনজি চিত্রগুলিতে ভেক্টর ড্রয়িং ব্যবহার করে (যেহেতু মেমরির সমস্যাটি এটি আবার সক্ষম করার জন্য একটি বিকল্প সরবরাহ করার পরেও ঘটবে)।

আমি নিশ্চিত নই যে এটি সর্বোত্তম বিকল্প কিনা, তবে এটি আমার মতে সমস্ত ক্র্যাশ সংশোধন করে।


4
ধন্যবাদ @ গুয়েলহের্ম পি। তবে আপনি পুনর্নির্মাণের সময় পিএনজি তৈরির পুনরায় vectorDrawables.useSupportLibrary = trueসক্ষম করতে পেরোপার্টিটি সরিয়ে ফেললেন না কেন ?
বেহজাদ বাহমানিয়র

4
স্মৃতি সমস্যার কারণে এটি সর্বশেষতম সংস্করণ v23.3.0 এ অক্ষম ছিল। এইভাবে, তারা রানটাইম সময়ে পিএনজি তৈরি করতে পারে না ... এ কারণেই তারা প্রিন্ট করে লগক্যাট ত্রুটি: অজানা ট্যাগ ভেক্টর (বা এর মতো কিছু)।
W0rmH0le

4
এখানে opt-in দিকনির্দেশগুলি Plus.google.com/+AndroidDevelopers/posts/B7QhFkWZ6YX- এ রয়েছে । দুর্ভাগ্যক্রমে ভেক্টরড্রেবেবলগুলি এখনও প্রি-ললিপপ ডিভাইসে কাজ করছে না। আমি সমর্থন লাইব্রেরিতে ২৩.৪.০ এ আছি এবং ডিফল্টকনফিগ called called নামে ডাকা 'জেনারেটডেনসিটিস [[]' এবং 'ভেক্টরড্রেবিলস.ইউজসপোর্টলিবারি = সত্য' উভয়ই রয়েছে}
অ্যাডাম হুরউইৎজ

4
@ অ্যাডামহুরভিটস আমি উত্তরটি আপডেট করেছি .. দেখে মনে হচ্ছে এটি আবার সক্ষম হয়েছে .. তবে আপনাকে এখনই এটি অন্যভাবে সক্ষম করতে হবে।
W0rmH0le

4
@ জুজটকোড আপনি ঠিক বলেছেন আপনার ব্যবহার করা উচিত 'androidx.appcompat: appcompat: 1.1.0'
W0rmH0le

63

আমারও একই সমস্যা ছিল। তবে প্রচুর গবেষণা ও গবেষণা করে উত্তর পেয়েছি।

ইমেজভিউ এবং ইমেজবটন ব্যবহারের জন্য এবং এক্সএমএল ব্যবহার app:srcCompat="@drawable/...." না করে বাটন, টেক্সটভিউয়ের মতো অন্যান্য দর্শনের জন্য "drawableLeft/right...", প্রোগ্রামযোগ্যভাবে অঙ্কনযোগ্যকে নির্দিষ্ট করুন:

button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null);

এবং অঙ্কনযোগ্যটি পেতে "অ্যাপকম্প্যাটআরসোর্সগুলি" ব্যবহার করুন।


60

অন্যান্য খুব ভাল উত্তরের বিস্তারিত জানাতে , এখানে একটি চিত্র রয়েছে যা আপনাকে সহায়তা করতে পারে। আপনার যদি 23.4.0 থেকে কমপক্ষে 25.1.0 পর্যন্ত সমর্থন লাইব্রেরি থাকে তবে এটি বৈধ।

ভেক্টরড্রায়েবল চিটশিট


4
আপনি এখানে উল্লেখযোগ্যভাবে একটি অঙ্কনযোগ্য ভিতরে বামন মোড়ক আঁকিয়ে সেট করার চেষ্টা করছেন ক্ষেত্রে। medium.com/@chrisbanes/...
nizam.sp

আপনাকে ধন্যবাদ এই চার্টটি আমাদের অনেক সহায়তা করে।
সাইনেন্টসো

39

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

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

স্মরণ করুন: আপনার এখনও গ্রেডে সহায়তা লাইব্রেরির ব্যবহার সক্ষম করতে হবে:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

এছাড়াও, নিশ্চিত করুন যে আপনি v23.4 চেয়ে সমর্থন গ্রন্থাগার সংস্করণ বৃহত্তর ব্যবহার করছেন না, যখন Google VectorDrawables জন্য অঙ্কনযোগ্য পাত্রে জন্য সমর্থন জুড়েছে ( মুক্তি নোট )

হালনাগাদ

এবং কোড পরিবর্তনের জন্য:

  1. অ্যাট্রিবিউটটি app:srcCompatস্বীকার করে এমন প্রতিটি স্থানে আপডেট করার বিষয়টি নিশ্চিত করুন android:src(আইডিই যদি তা <bitmap>ট্যাগের মতো অবৈধ হয় তবে আপনাকে সতর্ক করবে )।
  2. জন্য drawableLeft, drawableStart, drawableRight, drawableEndব্যবহৃত বৈশিষ্ট্যাবলী TextViewএবং অনুরূপ মতামত, আপনি তাদের এখন জন্য প্রোগ্রামেটিক্যালি সেট করতে হবে। স্থাপনের একটি উদাহরণ drawableStart:

    Drawable drawable = AppCompatResources.getDrawable(
            getContext(),
            R.drawable.your_vector_drawable);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null);
    }
    

মনে রাখবেন গ্রেডে ভেক্টর ড্রয়যোগ্যদের জন্য আপনার সমর্থন লাইব্রেরির ব্যবহার থাকা দরকার: ভেক্টরড্রাব্যেলস.উসসপোর্টলিবারি = সত্য
বেনি

4
হ্যাঁ আমি জানি. টেক্সটভিউয়ের জন্য ভেক্টর ড্রইবলকে ড্রয়যোগ্য হিসাবে কাজ করতে একটি মোড়কের দরকার আছে, সুতরাং এই উত্তরটি অসম্পূর্ণ।
সিজার্ডগুলি

4
দুর্দান্ত উত্তর। এটি কাস্টম বেস ক্রিয়াকলাপ থেকে প্রসারিত এর সমস্ত ক্রিয়াকলাপ সহ অ্যাপ্লিকেশনগুলির জন্য বিশেষত ভাল।
হংকং

14

আমারও একই সমস্যা ছিল। এবং অপসারণ দ্বারা এটি ঠিক করুন

vectorDrawables.useSupportLibrary = true

আমার লক্ষ্য সংস্করণটি 25 এবং সমর্থন লাইব্রেরি

 compile 'com.android.support:appcompat-v7:25.3.1'

4
এটি আমার জন্য কাজ করেছে। ধন্যবাদ আমি সবেমাত্র এটি সরিয়ে দিয়েছিvectorDrawables.useSupportLibrary = true
অ্যান্ড্রয়েড মিডিয়োক্রে

আমি মনে করি এটি করার উপযুক্ত উপায় এটি নয়, যেভাবেই আমি আপনার উত্তরে আপত্তি জানিয়েছি !!
হরিশ রেড্ডি

ধন্যবাদ. t আমার অ্যাপ্লিকেশনটির জন্য কাজ করে। এটি যদি সরানো হয় তবে সমস্ত ভেক্টর ড্রয়যোগ্য এখনও কাজ করে। অ্যাপ্লিকেশনটি com.android.support :appcompat
হংকং

10

প্রি-ললিপপটিতে ভেক্টরড্রেবেবলগুলি ব্যবহার না করে সূক্ষ্মভাবে কাজ করা উচিত

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

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

android:drawableLeft="@{@drawable/vector_ic_access_time_24px}"
android:drawableStart="@{@drawable/vector_ic_access_time_24px}"

এটি যাদুতে কাজ করবে, আমি পর্দার আড়ালে কী ঘটছে তা তদন্ত করে দেখিনি, তবে আমার অনুমান যে টেক্সটভিউ অ্যাপকোম্প্যাটআরসোসেস বা অনুরূপ থেকে getDrawable পদ্ধতি ব্যবহার করছে।


নির্বাচকটিতে ভেক্টর চিত্র কীভাবে সেট করবেন?
তুষার গোগনা

ভেক্টরড্রেবয়েবলস.ইউজসপোর্টলিবারি সেট করার পরে = গ্রেড ডিফল্ট এবং অ্যাপকম্প্যাটডেলিগেট.সেট কমপ্যাটভেেক্টরফ্রোম রিসোর্সইনবেবল (সত্য) এ সত্য; ক্রিয়াকলাপে অ্যান্ড্রয়েডের সাথে ক্রাশ এড়াতে : টেক্সটভিউতে অঙ্কনযোগ্য বাম, পরীক্ষার জন্য টেক্সটভিউটিতে প্রোগ্রামিয়িকভাবে আঁকতে বামে সেট করুন: টেক্সটভিউ.সেটম্পাউন্ডড্রাব্যাবলস উইথ ইন্ট্রিনসিকবাউন্ডস (আর .ড্রাব্যাবল.মোভি, 0, 0, 0);
আফজালুর রহমান রানা

7

প্রচুর পরিমাণে অ্যান্ড ডি, অবশেষে প্রাক-ললিপপ ডিভাইসে ক্র্যাশের জন্য এই সমাধানটি পেয়েছে।

ইমেজভিউয়ের জন্য

  • অ্যাপ্লিকেশনটি ব্যবহার করুন: Android: src এর পরিবর্তে srcCompat

টেক্সটভিউ / সম্পাদনা পাঠের জন্য For

  • অঙ্কনযোগ্য , সরানোর যোগ্য সরান .... এবং অঙ্কনযোগ্য জাভা কোড থেকে সেট করুন।

txtview.setCompoundDrawablesWithIntrinsicBounds (AppCompatResources.getDrawable (ইভেন্টডেটেলসিংলপেজ.থিস, আর.ড্রেবএবল.ইক_ডোন_ব্ল্যাক_24_ এন), নাল, নাল, নাল);

বিল্ড.gradle জন্য

vectorDrawables.useSupportLibrary = সত্য


4
এটি অনন্য সমাধান যা টেক্সট ইনপুটএডিটটেক্সটে কাজ করেছিল।
heronsanches

4
ভাল, এটি আমার সমস্যার সমাধান হয়েছে hisএর উত্তর গ্রহণ করা উচিত।
ডিজেটিওয়ারি

7

সবচেয়ে সহজ উপায়:

app:drawableRightCompat ="@drawable/ic_mobilelogin"
app:drawableEndCompat="@drawable/ic_mobilelogin"
app:srcCompat="@drawable/ic_mobile"

এবং ... কেবল app:**Compatসামঞ্জস্যের জন্য ব্যবহার করুন । build.gradle(মডিউল) উপর সমর্থন যোগ করুন

android {
   defaultConfig {
       vectorDrawables.useSupportLibrary = true
   }
}

অ্যাপ: drawableEndCompat এবং অ্যাপ: drawableRightCompat কাছাকাছি একই জিনিস ইংরেজি যদি
হোসাম হাসান

5

অ্যান্ড্রয়েড গ্রেড 3.0.০ বা তারপরের উপরে যে কেউ আপগ্রেড করে তাদের জন্য, ব্যবহার করার দরকার নেই AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)বা সেট করতে হবে vectorDrawables.useSupportLibrary = true(এটি যুক্ত করুন সমস্যা তৈরি করবে) এবং ব্যবহার করুন app:srcCompat, এটি কেবল কার্যকর।

এটি বের করার জন্য আমাকে দু'দিন সময় নিন এবং গুগলের ডক্সে কোনও সম্পর্কিত ডক্স খুঁজে পান না ...


আকর্ষণীয়, আমি গ্রেড 3.3.0 ব্যবহার করছি এবং এই সমাধানটি কাজ করে। যাইহোক, অ্যান্ড্রয়েড স্টুডিও এখনও আমাকে সেট ভেক্টরড্রেবলগুলি.উসসপোর্টপোর্ট লাইবারি = সত্য সক্ষম করতে বলছে।
মাস্টারওয়াক

2

আমি প্রি-ললিপপ ডিভাইসে ভেক্টরড্রেইবলগুলি ব্যবহার করছি এবং এটি আমি এটির মতো করে করি: -

পদক্ষেপ 1: এটি আপনার অ্যাপ্লিকেশন স্তরের গ্রেডে রাখুন।

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

ধাপ ২:

এটিকে আপনার অ্যাপ্লিকেশন শ্রেণিতে রাখুন এবং ম্যানিফেস্ট ফাইলটিতে আপনার অ্যাপ্লিকেশন ক্লাসটি নিবন্ধ করতে ভুলবেন না।

public class App extends Application {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

ধাপ 3:

ভেক্টর ড্র্যাবেবলগুলি ব্যবহার করে পান,

imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable));

2

নীচের কোড ব্যবহার করার পরে।

android {
  defaultConfig {
  vectorDrawables.useSupportLibrary = true  
                }
        }




public class App extends Application {
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}}

এখনও, ভেক্টর ইমেজ ইস্যু নীচের বৈশিষ্ট্যগুলির জন্য বিদ্যমান

DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, ব্যাকগ্রাউন্ড

এই ক্ষেত্রে, দয়া করে নীচের মত অনুসরণ করুন, ভেক্টর চিত্রটি উল্লেখ করার পরিবর্তে সরাসরি মধ্যবর্তী অঙ্কনীয় ফাইল হিসাবে নির্বাচক ট্যাগটি ব্যবহার করুন।

উদাহরণ:

ic_warranty_icon.xML

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="17"
android:viewportHeight="24">

<path
    android:fillColor="#fff"
    android:pathData="M10.927,15.589l-1.549,0.355a7.47,7.47 0,0 1,-0.878 0.056c-4.136,0 -7.5,-3.364 -7.5,-7.5s3.364,-7.5 7.5,-7.5 7.5,3.364 7.5,7.5c0,3.286 -2.126,6.078 -5.073,7.089zM8.5,2a6.508,6.508 0,0 0,-6.5 6.5c0,3.583 2.917,6.5 6.5,6.5s6.5,-2.917 6.5,-6.5 -2.917,-6.5 -6.5,-6.5z" />

Safe_ic_warranty_icon.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_warranty_icon"  />
</selector>

আপনার পাঠ্যদর্শন / বিন্যাস

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_warranty_icon"
       />


<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_warranty_icon"
       />

ধন্যবাদ !!! পটভূমি সম্পত্তি জন্য, সরাসরি ভ্যাক্টর অঙ্কনযোগ্য প্রি-ললিপপ এপিআই (19) এর জন্য কাজ করার পরিবর্তে এর মধ্যে নির্বাচক যুক্ত করা।
অঙ্কুর

আমার ক্ষেত্রে, এই এখনও না এপিআই (16) জন্য কাজ, এমনকি সঙ্গে মোড়কে করেselector
mochadwi

1

আমরা 3 টি জিনিস চেষ্টা করেছি

vectorDrawables.useSupportLibrary = true

অ্যাপ্লিকেশন ক্লাসে সেটকম্প্যাটভিেক্টর থেকে রিসোর্সস সক্ষম করা হচ্ছে

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

আর ব্যবহার করুন app:srcCompat

তবে তার পরেও এটি ব্যর্থ হয়েছিল

Resources$NotFoundException: File res/drawable/$my_icon__0.xml from color state list resource ID #0x7f080008

তারপরে আমরা আবিষ্কার করেছি যে আমাদের এসভিজির একটি গ্রেডিয়েন্ট ট্যাগ রয়েছে। নীচের API <= 23 এর জন্য পৃথক পথে গ্রেডিয়েন্ট ট্যাগ রূপান্তর করা এবং একই এসভিজি এপিআই> = 24 ব্যবহার করে কাজ হয়েছে।

এই উত্তরটি থেকে সহায়তা পান https://stackoverflow.com/a/47783962/2171513


আমি জানি না কেন কেন কেউ এটিকে উত্সাহ দেয় না, তবে এটি আসলেই আমার সমস্যার সমাধান হতে পারে। আপনাকে ধন্যবাদ
DevMike01

1

আমি এই নিয়ে ঘন্টার পর ঘন্টা লড়াই করে যাচ্ছিলাম।

এই উত্তরগুলি আমাকে যা বলেছে তার সব চেষ্টা করেছি, কিন্তু আমার অ্যাপটি ক্রাশ হওয়া বন্ধ করে নি। আমি এই লাইনটি মুছে ফেলেছি: app:srcCompat="@drawable/keyboard"এবং আমার অ্যাপ্লিকেশন ক্রাশ হওয়া বন্ধ করেছে। এবং তারপরে যখন আমি এই একই জিনিসটি আবার যুক্ত করেছি, এটি আবার ক্রাশ শুরু হয়েছিল। সুতরাং আমি সেই ফাইলটি খোলার সিদ্ধান্ত নিয়েছি এবং আমি প্রথম লাইনে একটি ত্রুটি দেখলাম

"অঙ্কনযোগ্য 'কীবোর্ড' এর বেস অঙ্কনযোগ্য ফোল্ডারে কোনও ঘোষণা নেই; এটি ক্রাশ হতে পারে।

আমি ফাইলটি ডান-ক্লিক করে "এক্সপ্লোরার-এ দেখান" ক্লিক করেছি এবং এটি অঙ্কনযোগ্য ফোল্ডারে ছিল না তবে অঙ্কনযোগ্য-ভি 24 ডিরেক্টরিতে ছিল। সুতরাং আমি এটিকে অনুলিপি করেছি এবং আঁকতে সক্ষম ডিরেক্টরিতে আটকানো এবং অবশেষে ক্রাশ থেকে মুক্তি পেয়েছি।


0

কেবলমাত্র ওভারল্যাপ ভেক্টরকে রাজ্য-তালিকায় আঁকতে পারে তারপরে সমস্যার সমাধান হবে

উদাহরণস্বরূপ আপনার পিছনে তীর ভেক্টর চিত্র রয়েছে:

ic_back_arrow.xml

হ্যাঁ, আপনি এটি স্তর তালিকা xml (আইকোব্যাক_আরো_ভেেক্টর_ভেক্টর.এক্সএমএল) এ ওভারল্যাপ করা উচিত:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_back_arrow"/>
</layer-list>

কারণ যুক্তি:

vectorDrawables.useSupportLibrary = true

এবং

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

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


-2

গিলহর্ম পি এর পরামর্শ আমার পক্ষে কাজ করে নি। আমি এগিয়ে গিয়ে পিএনজি ব্যবহারের সিদ্ধান্ত নিয়েছিলাম যেখানে অ্যাপের বাইরে আমার জিনিসগুলি করা দরকার: srcCompat অর্থাৎ অঙ্কনযোগ্য লেফট, অঙ্কনযোগ্য রাইট ইত্যাদি This এটি করা খুব সহজ পরিবর্তন ছিল এবং এতে সম্ভাব্য মেমরির সমস্যা নেই AppCompatDelegate.setCompatVectorFromResferencesEnabled ( সত্য); পরিচয় করিয়ে দেয়।


-3

বেনির উত্তরের বিকল্প হ'ল একটি Activityসুপারক্লাস তৈরি করা :

public abstract class VectorDrawableActivity extends AppCompatActivity {
  static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
  }

  //...
}

VectorDrawableActivityপরিবর্তে প্রসারিত করুন AppCompatActivity


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