অ্যান্ড্রয়েড: ড্রয়যোগ্যরাট?


120

আমি যখন টেক্সটভিউ বা ইমেজভিউতে ভেক্টরড্র্যায়েবল সম্পদ ব্যবহার করি তখন আমি "অ্যান্ড্রয়েড: ড্রইবলআরাইট" / "অ্যান্ড্রয়েড: ড্রইবলএন্ড" / "অ্যান্ড্রয়েড: ড্রইবলস্টার্ট" / "অ্যান্ড্রয়েড: ড্রইবল লেফট" ব্যবহার করার সময় রানটাইম ক্র্যাশ পাই।

অ্যাপটি কোনও সতর্কতা ছাড়াই জরিমানা সংকলন করবে।

আমি ব্যাবহার করছি

  • গ্রেডল 1.5.০।
  • সমর্থন লাইব্রেরি 23.2 ('com.android.support:appcompat-v7:23.2.0')

যাইহোক আমি যা পেয়েছি তা হ'ল আমি প্রোগ্রামটিভভাবে জাভাতে এসভিজি এর মতো ক্রাশ ছাড়াই নির্ধারণ করতে পারি।

TextView tv = (TextView) findViewById(R.id.textView);
tv.setCompoundDrawablesWithIntrinsicBounds(null,null, getResources().getDrawable(R.drawable.ic_accessible_white_36px),null);

(আমি সন্দেহ করি এটি 23.2 এর জন্য একটি সমর্থন লাইব্রেরি বাগ))

তবে এসভিজির সম্পদের জন্য কী অঙ্কনযোগ্য রাইট ইত্যাদি ব্যবহার করা সম্ভব?

এখানে আমার লেআউট

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="au.com.angryitguy.testsvg.MainActivity">


<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableRight="@drawable/ic_accessible_white_36px"
    android:background="@color/colorPrimary"
    android:textColor="#FFFFFF"
    android:textSize="22sp"
    android:text="Hello World!"/>
</RelativeLayout>

এখানে আমার ক্রিয়াকলাপ

package au.com.angryitguy.testsvg;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        }
    }

গুগলের ম্যাটেরিয়াল ডিজাইনের সাইট থেকে অযৌক্তিক ভেক্টর ড্রয়যোগ্য সম্পদটি এখানে।

<vector android:height="24dp" android:viewportHeight="24.0"
    android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FFFFFF" android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
    <path android:fillColor="#FFFFFF" android:pathData="M19,13v-2c-1.54,0.02 -3.09,-0.75 -4.07,-1.83l-1.29,-1.43c-0.17,-0.19 -0.38,-0.34 -0.61,-0.45 -0.01,0 -0.01,-0.01 -0.02,-0.01L13,7.28c-0.35,-0.2 -0.75,-0.3 -1.19,-0.26C10.76,7.11 10,8.04 10,9.09L10,15c0,1.1 0.9,2 2,2h5v5h2v-5.5c0,-1.1 -0.9,-2 -2,-2h-3v-3.45c1.29,1.07 3.25,1.94 5,1.95zM12.83,18c-0.41,1.16 -1.52,2 -2.83,2 -1.66,0 -3,-1.34 -3,-3 0,-1.31 0.84,-2.41 2,-2.83L9,12.1c-2.28,0.46 -4,2.48 -4,4.9 0,2.76 2.24,5 5,5 2.42,0 4.44,-1.72 4.9,-4h-2.07z"/>
</vector>

এখানে আমার অ্যাপ্লিকেশন build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "au.com.angryitguy.testsvg"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        // Stops the Gradle plugin’s automatic rasterization of vectors
        generatedDensities = []
    }
    // Flag to tell aapt to keep the attribute ids around
    aaptOptions {
        additionalParameters "--no-version-vectors"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
}

এখানে দুর্ঘটনা ঘটছে। (পাঠ্যদর্শনটি উল্লেখ করে এমন স্ফীত ত্রুটিগুলি নোট করুন))

java.lang.RuntimeException: Unable to start activity ComponentInfo{
    au.com.angryitguy.testsvg/au.com.angryitguy.testsvg.MainActivity}: 
    android.view.InflateException: Binary XML file line #13: 
    Error inflating class TextView

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
...

Caused by: android.view.InflateException: 
    Binary XML file line #13: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:5008)
...

Caused by: android.content.res.Resources$NotFoundException: 
    File res/drawable/ic_accessible_white_36px.xml from drawable resource ID #0x7f02004b
at android.content.res.Resources.loadDrawable(Resources.java:1918)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:622)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60)
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14) 
at android.app.Activity.performCreate(Activity.java:5008) 
...

Caused by: org.xmlpull.v1.XmlPullParserException:
    Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1915)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
at android.widget.TextView.<init>(TextView.java:622) 
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:60) 
at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:56) 
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103) 
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963) 
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022) 
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
at au.com.angryitguy.testsvg.MainActivity.onCreate(MainActivity.java:14) 
at android.app.Activity.performCreate(Activity.java:5008) 
...

না, আপনি পারবেন না, যেহেতু এসভিজি ফাইলগুলি স্থানীয়ভাবে সমর্থিত নয় । পরিবর্তে আপনাকে একটি ভেক্টরড্রেইবল ব্যবহার করতে হবে (যা কেবল এসভিজি স্পেসের একটি উপসেট ব্যবহার করে)।
ফ্যান্টেম্যাক্সেক্স

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

আমি এটি আমার জন্য কাজ করেছিলাম: android.jlelse.eu/…
হুই টাওয়ার

উত্তর:


186

এসভিজি সম্পদের জন্য অঙ্কনযোগ্য রাইট ইত্যাদি ব্যবহার করা কি সম্ভব?

হ্যাঁ

AppCompatTextView এখন সমর্থন app:drawableLeftCompat, app:drawableTopCompat, app:drawableRightCompat, app:drawableBottomCompat, app:drawableStartCompatএবং app:drawableEndCompatযৌগ অঙ্কনযোগ্য, অঙ্কনযোগ্য ধরনের যেমন ব্যাক-পোর্ট সমর্থন VectorDrawableCompat

এটি আপনার গ্রেড ফাইলটিতে অন্তর্ভুক্ত করুন

implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'

আপনার পাঠ্য দৃশ্যে আপনি ব্যবহার করতে পারেন

app:drawableLeftCompat
app:drawableStartCompat

অ্যাপ্লিকেশনটি ব্যবহার করার সময় আপনার যদি সমস্যা হয়: ড্রয়েবল লেফট কমপ্যাট, অ্যাপ: ড্রোনযোগ্য স্টার্টকম্পেট বোতামগুলিতে আপনাকে আপনার লাইব্রেরিটি আপডেট করতে হবে

androidx.appcompat: appcompat: 1.2.0-alpha01

তাদের একটি বাগ ছিল

androidx.appcompat: appcompat: 1.1.0-alpha01

আপনি দস্তাবেজগুলি দেখতে পাবেন


অথবা আপনি যদি এখনও আপডেট করতে চান না, তবে:

যেহেতু মনে হচ্ছে গুগল খুব শীঘ্রই এই সমস্যাটি সম্পর্কে কিছু করতে যাচ্ছে না, তাই আমার সমস্ত অ্যাপ্লিকেশনের জন্য আমাকে আরও শক্ত পুনরায় ব্যবহারযোগ্য সমাধান নিয়ে আসতে হয়েছিল:

  1. প্রথম যোগ কাস্টম TextView আপনার অ্যাপের attrs.xml ফাইলে বৈশিষ্ট্যাবলী "মাঝামাঝি / মান / attrs.xml" :

    <resources>
        <declare-styleable name="CustomTextView">
            <attr name="drawableStartCompat" format="reference"/>
            <attr name="drawableEndCompat" format="reference"/>
            <attr name="drawableTopCompat" format="reference"/>
            <attr name="drawableBottomCompat" format="reference"/>
        </declare-styleable>
    </resources>
  2. তারপরে কাস্টম টেক্সটভিউ ক্লাসটি তৈরি করুন:

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.drawable.Drawable;
    import android.os.Build;
    import android.support.v7.content.res.AppCompatResources;
    import android.support.v7.widget.AppCompatTextView;
    import android.util.AttributeSet;
    
    public class CustomTextView extends AppCompatTextView {
        public CustomTextView(Context context) {
            super(context);
        }    
        public CustomTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initAttrs(context, attrs);
        }
        public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initAttrs(context, attrs);
        }
    
        void initAttrs(Context context, AttributeSet attrs) {
            if (attrs != null) {
                TypedArray attributeArray = context.obtainStyledAttributes(
                        attrs,
                        R.styleable.CustomTextView);
    
                Drawable drawableStart = null;
                Drawable drawableEnd = null;
                Drawable drawableBottom = null;
                Drawable drawableTop = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    drawableStart = attributeArray.getDrawable(R.styleable.CustomTextView_drawableStartCompat);
                    drawableEnd = attributeArray.getDrawable(R.styleable.CustomTextView_drawableEndCompat);
                    drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);
                    drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat);
                } else {
                    final int drawableStartId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableStartCompat, -1);
                    final int drawableEndId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableEndCompat, -1);
                    final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, -1);
                    final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, -1);
    
                    if (drawableStartId != -1)
                        drawableStart = AppCompatResources.getDrawable(context, drawableStartId);
                    if (drawableEndId != -1)
                        drawableEnd = AppCompatResources.getDrawable(context, drawableEndId);
                    if (drawableBottomId != -1)
                        drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId);
                    if (drawableTopId != -1)
                        drawableTop = AppCompatResources.getDrawable(context, drawableTopId);
                }
    
                // to support rtl
                setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);
                attributeArray.recycle();
            }
        }
    }
  3. এখন আপনি এটি আপনার কাস্টম বৈশিষ্ট্য দ্বারা যে কোনও বিন্যাসে সহজেই ব্যবহার করতে পারেন:

    <YOUR_VIEW_PACKAGE.CustomTextView
        android:id="@+id/edt_my_edit_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:drawableStartCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
        app:drawableEndCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
        app:drawableTopCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
        app:drawableBottomCompat="@drawable/your_vector_drawable" <!-- vector drawable -->
        />
    • আপনি বোতাম , এডিটেক্সট এবং রেডিওবটনগুলির সাথে একই জিনিস করতে পারেন কারণ তারা পাঠ্য ভিউ থেকে প্রাপ্ত

আশাকরি এটা সাহায্য করবে :)


4
খুব দরকারী উত্তর। যাইহোক, আমি দাদুর খুব সম্পূর্ণ উত্তরও পড়ার পরামর্শ দিচ্ছি । সরানো হচ্ছে vectorDrawables { useSupportLibrary = true }আমার থেকে build.gradleযে উত্তর আমার জন্য কাজ পরামর্শ দেয়।
স্যাম

আমি তা করেছিলাম এবং আমার এখন নিম্নলিখিত সমস্যাটি রয়েছে: আমি যখন এক্সএমএলে অন্লিকটি সংযুক্ত করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই: java.lang.NoSuchMethodException: on [ক্লাস android.view.View]
রামদানে ওউলিটসেন

3
vectorDrawables useSupportLibrary = trueগ্রেড থেকে লাইন অপসারণের সাথে আমি একমত নই। আপনি যখন এটি সরিয়ে ফেলেন, আপনি এখনও আপনার দর্শনগুলির ভিতরে ভেক্টর রাখতে পারেন, তবে তারা পিএনজি'র মতো আকার পরিবর্তন করে যার অর্থ তারা প্রসারিত হবে এবং দানাদার হয়ে উঠবে। যদি আপনি 5.0 / API21 এর নীচের ডিভাইসগুলি ভেক্টরগুলিকে যথাযথ আকার পরিবর্তন করতে চান তবে সেগুলি খাস্তা দেখাচ্ছে, আপনার অবশ্যই লাইনটি গ্রেড ফাইলের অভ্যন্তরে ব্যবহার করতে হবে। সেই লাইনটি রেখে আইডিইকে আপনি যে জায়গাগুলিতে ভেক্টরগুলি ভুলভাবে ব্যবহার করছেন সেগুলি সন্ধান করতে অনুরোধ জানায় এবং তারপরে আপনাকে অবশ্যই app:srcCompatএক্সএমএল এর মাধ্যমে ব্যবহার করতে হবে বা কোড দিয়ে সেট করতে হবেVectorDrawableCompat.create()
হেইনস গেমস

কীভাবে app:drawableEndCompatআরও ভাল আরটিএল সমর্থন যুক্ত করবেন? কারণটির জন্য setCompoundDrawablesRelativeWithIntrinsicBoundsকমপক্ষে এপিআই স্তর 17 প্রয়োজন।
ডাঃ জ্যাকি

1
প্রোগ্রামযোগ্যভাবে অঙ্কনযোগ্য সেট করার বিষয়ে কী?
অ্যান্ড্রয়েড বিকাশকারী

77

এই সমাধানটি আর সঠিক নয়। ২৩.৩.০ সংস্করণ থেকে ভেক্টর ড্রয়াবলগুলি কেবল অ্যাপ্লিকেশন: srcCompat বা setImageResource () এর মাধ্যমে লোড করা যায়)

আপনার ভেক্টর আঁকতে সক্ষম স্তর-তালিকা বা নির্বাচকের মধ্যে মোড়ানোর চেষ্টা করুন:

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableRight="@drawable/ic_accessible_white_wrapped"
    android:background="@color/colorPrimary"
    android:textColor="#FFFFFF"
    android:textSize="22sp"
    android:text="Hello World!"/>

ic_accessible_white_wrapped.xml:

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

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

1
হ্যাঁ. আপনি এটি সরাসরি ব্যবহার করতে পারবেন না। কেবল অ্যাপ্লিকেশন হিসাবে: srcCompat বা মোড়ানো বা প্রোগ্রামগতভাবে। এটি এখানে বর্ণিত হয়েছিল: android-developers.blogspot.ru/2016/02/…
আলেকজান্ডার শুটকো

আহ .. ধন্যবাদ .. আমি যে অনুচ্ছেদে উল্লেখ করছি তা আমি দেখতে পাচ্ছি। সুতরাং, যদি তারা আপনাকে এটি না করতে বলে তবে এটি এখনও কোনও বাগ? ;)
রাগ করুন gu

1
আমি মনে করি এটি পিছনে সামঞ্জস্যের সমস্ত বিষয়। দেখে মনে হচ্ছে সম্পূর্ণ এসভিজি সমর্থন পেতে কিছু সমস্যা আছে, তাই তারা কিছুটা কার্যকরী করেছে ...
আলেকজান্ডার শুটকো

2
সমর্থন সংস্করণ ২৩.৩.০ থেকে হরিশজ্ঞানী, এটি কোনও দীর্ঘস্থায়ী সমর্থন নয়। আপনাকে অবশ্যই আপনার ক্রিয়াকলাপে আরও কমান্ড যুক্ত করতে হবে: স্থির {যদি (বিল্ড.ভি.এস.আর। }}
কুওং

75

আমি সবচেয়ে ভাল উপায় খুঁজে পেয়েছি:

Drawable leftDrawable = AppCompatResources.getDrawable(this, R.drawable.ic_search);
search.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

9
8/25/17 পর্যন্ত এটিই আমার পক্ষে কাজ করে (প্রোগ্রামযোগ্যভাবে অঙ্কনযোগ্য সেট করে)। আমি প্রকৃতপক্ষে ব্যবহার করেছি:Drawable drawable = VectorDrawableCompat.create(getResources(), status.getIconResId(), wrapper.getTheme()); statusButton.setCompoundDrawablesRelativeWithIntrinsicBounds(null, drawable, null, null);
সাইয়ানকডার

2
জন্য minSdk setCompoundDrawablesWithIntrinsicBoundsহয় 17 । অন্যথায় এটি দুর্দান্ত কাজ করে।
ভিক্টর রেন্ডিনা

1
এর মিনিএসডিকিটি 1 নয় 17, আপনি সম্ভবত এটির মতো এপিএস দেখতে পাবেন। setCompoundDrawablesWithIntrinsicBounds => minSdk 1; সেটকম্পাউন্ডড্রোয়েবালস রিলেটিভ উইথইন্ট্রিন্সিকবাউন্ডস => মিনিএসডেক 17
白 布鞋

প্রোগ্রামগতভাবে সেটিংয়ের জন্য সেরা সমাধান, +1
ওয়াটন সাম্পাও

আমি এটি বাইন্ডিংএডাপ্টারগুলির সাথে ব্যবহার করেছি এবং কার্যকরভাবে কাজ করি, ধন্যবাদ!
Ric17101

61

এখানে কয়েকটি উত্তরের পরিপূরক হিসাবে: আপনি ভেক্টরড্রেইবলকে drawableLeft(ইত্যাদি) হিসাবে কাজ করতে পারেন তবে এটি সাপোর্ট লাইব্রেরি সংস্করণের উপর নির্ভর করে এবং এটি একটি দাম সহ আসে।

কোন ক্ষেত্রে এটি কাজ করে? আমি সাহায্য করার জন্য এই চিত্রটি তৈরি করেছি (সমর্থন লাইব্রেরির জন্য বৈধ 23.4.0 থেকে কমপক্ষে - 25.1.0)।

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


2
এটি দুর্দান্ত তবে আপনার স্ট্যাটিক ব্লকে পদ্ধতির নামটি এতে ঠিক করা উচিতsetCompatVectorFromResourcesEnabled
বিকাশ পাটিদার

1
setCompatVectorFromResourcesE सक्षम সমাধান 25.3.1 এ কাজ করে না, দুর্ভাগ্যক্রমে
ইলজা এস

From 23.3.0 version vector drawables can only be loaded via app:srcCompat or setImageResource()সুতরাং এই সমাধানটি অবচিত করা হয়েছে এবং কাজ করবে না
ব্যবহারকারী 25

সক্ষম করা অ্যান্ড্রয়েড 4.x এ setCompatVectorFromSourcesEnabled(true)ভেক্টরড্রেবেবলগুলি লোড করা সম্ভব করে তোলে। android:backgroundসূতরাং ধন্যবাদ! (আপনাকে আসল ভেক্টরকে একটি আইটেম লেয়ার-লিস্টে
আবদ্ধ করতে হবে

14

অন্যান্য উত্তর কেউ কাজ করেন, এখানে কিভাবে আমি একটি যোগ করেছি VectorDrawableএকটি করতে TextView, আপনি ব্যবহার করা উচিত VectorDrawableCompat.create()যখন সঙ্গে তার আচরণ VectorDrawablesনিচে Android L:

TextView titleTextView = (TextView) viewHolder.getView(android.R.id.text1);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
       Drawable leftDrawable = AppCompatResources
                            .getDrawable(context, R.drawable.ic_tickbox);
       titleTextView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
}
else
{
      //Safely create our VectorDrawable on pre-L android versions. 
       Drawable leftDrawable = VectorDrawableCompat
                            .create(context.getResources(), R.drawable.ic_tickbox, null);
       titleTextView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
}

সংক্ষিপ্ত, মিষ্টি, এবং বিন্দু!


এটি অ্যান্ড্রয়েড পি, এবং সর্বনিম্ন API স্তরের 26 (টার্গেট 28)
মিস্টার

@ মিস্টার - এটি পিছনের
দিকেও

9

গুগল থেকে: অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি ২৩.৩.০ হিসাবে, সমর্থন ভেক্টর ড্রয়াবলগুলি কেবল অ্যাপ্লিকেশন: srcCompat বা setImageResource () এর মাধ্যমে লোড করা যায় ..

http://android-developers.blogspot.ru/2016/02/android-support-library-232.html


1
তার অর্থ এখনকার কোনও সমাধান নেই
হত্যাকারী

আপনার ভেক্টর আঁকতে সক্ষমকে স্তর-তালিকা বা নির্বাচক হিসাবে মোড়ানোর চেষ্টা করুন: <টেক্সটভিউ অ্যান্ড্রয়েড: আইডি = "@ + আইডি / টেক্সটভিউ" অ্যান্ড্রয়েড: লেআউট_উইথ = "ম্যাচ_প্যারেন্ট" অ্যান্ড্রয়েড: লেআউট_এইচটি = "র‌্যাপ_কন্টেন্ট" অ্যান্ড্রয়েড: অঙ্কনযোগ্য রাইট = "@ অঙ্কনযোগ্য / আইসি_অ্যাক্সেসযোগ্য_ভাইট_রেপড" অ্যান্ড্রয়েড: পটভূমি = "@ রং / colorPrimary" Android: textcolor = "# FFFFFF" Android: textSize = "22sp" Android: পাঠ্য = "হ্যালো ওয়ার্ল্ড!" /> ic_accessible_white_wrapped.xml: <স্তর-তালিকা xmlns: Android = " স্কিমের .android.com / apk / res / android "> <আইটেম অ্যান্ড্রয়েড: অঙ্কনযোগ্য =" @ অঙ্কনযোগ্য / আইসি_অ্যাক্সেসিবল_ওয়াইট_36px "/> </layer-list>
নাল পয়েন্টার ব্যতিক্রম

9

এক্সএমএলে সরাসরি ভেক্টর ড্রয়াবল সেট করা সম্ভব তবে আপনি ডেটা বাইন্ডিং ফ্রেমওয়ার্কটি অন্তর্ভুক্ত করেছেন।

শুধু লেখো

<TextView
...
android:drawableRight="@{@drawable/ic_accessible_white_36px}"/>

এবং আপনার পুরো লেআউটটিকে একটি <layout>ট্যাগে মুড়িয়ে রাখুন , সুতরাং মূলত আপনার এক্সএমএল দেখতে এই রকম হবে:

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

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="au.com.angryitguy.testsvg.MainActivity">


        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            android:drawableRight="@{@drawable/ic_accessible_white_36px}"
            android:text="Hello World!"
            android:textColor="#FFFFFF"
            android:textSize="22sp"/>
    </RelativeLayout>
</layout>

ডেটা বাইন্ডিং ফ্রেমওয়ার্কটি সক্রিয় করতে কেবল যুক্ত করুন

android {
    ....
    defaultConfig {
        dataBinding {
            enabled = true
        }
    }
}

বাইন্ডিং লাইব্রেরির আপনাকে অন্য কোনও বৈশিষ্ট্য ব্যবহার করতে হবে না

সম্পাদনা করুন:

অবশ্যই যদি আপনি ভেক্টর ড্রয়াবল প্রাক-ললিপপ ব্যবহার করতে চান তবে আপনার সমর্থন করে ভেক্টর ড্রয়াবলকে সক্ষম করতে হবে

vectorDrawables.useSupportLibrary = true

সুতরাং আপনার build.gradle2 টি নতুন কমান্ডের প্রয়োজন:

android {
    ....
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
        dataBinding {
            enabled = true
        }
    }
}

মন্তব্যের জন্য rkmax ধন্যবাদ


এটি একটি ভাল ধারণা, তবে এটি কাজ করার জন্য আপনাকে একটি বাধ্যতামূলক অ্যাডাপ্টার লিখতে হবে। এখানে একটি কার্যকারী উদাহরণ: gist.github.com/lisawray/78c33f76809d2bcbbec9983e2c141a70
ব্লেডকডার

1
আমি অবশ্যই এটি আমার জন্য কাজ করে তা বলতে চাই তবে আপনাকে vectorDrawables.useSupportLibraryঅ্যাপ্লিকেশন / বিল্ড.gradle এ সক্ষম করতে হবে এবং এছাড়াও ক্রিয়াকলাপে অ্যাপকোম্প্যাটডেলিগেট.সেট কমপ্যাটভেক্টর থেকে রিসোর্সসনেসড (সত্য) যুক্ত করতে হবে
rkmax

আমি ডিফল্ট কনফিগ যুক্ত করতে ভুলে গেছি build.gradleযে কারণ এটি কাজ করছে না কারণ হতে পারে
হান্স এম

ধন্যবাদ - আপনি জীবন রক্ষাকারী!
ভ্যান

এটি একটি আন্ডাররেটেড উত্তর!
ডিওয়াইএস

6

আমি সমস্ত উত্তর দিয়েছিলাম এবং সর্বশেষে অ্যান্ড্রয়েড স্টুডিও 3.0.০.১ এবং অ্যাপকম্প্যাট সহায়তা লাইব্রেরি ২ 26.১.০ ব্যবহার করে আমি নিশ্চিত করতে পারি যে এটি ঠিকঠাক কাজ করে।

ইন build.gradle (অ্যাপ) ফাইল

android {
    compileSdkVersion 26
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:26.1.0'
}

এবং ক্রিয়াকলাপ প্রসারিতকরণের AppcompatActivityমধ্যে এটি বাইরের পদ্ধতিগুলি যেমন একটি staticব্লক অন্তর্ভুক্ত করে

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}  

বা আপনি যদি এটি পুরো অ্যাপ্লিকেশনটিতে প্রয়োগ করতে চান তবে এই বর্গটিকে শ্রেণিবদ্ধকরণ Applicationশ্রেণীর মধ্যে অন্তর্ভুক্ত করুন

override fun onCreate() {
    super.onCreate()
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
}

এক্সএমএলে পাঠ্যদর্শন

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

<TextView
        android:id="@+id/passName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/account_drawableleft_selector"
        android:drawablePadding="5dp"
        android:ellipsize="marquee"
        android:fontFamily="@font/montserrat_light_family"
        android:gravity="center_vertical"
        android:marqueeRepeatLimit="marquee_forever"
        android:paddingRight="10dp"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textColor="@color/app_text_color"
        android:textSize="12sp"
        tools:text="Account Name" />
</LinearLayout>

account_drawableleft_selector.xml

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

কোন এপিআই তে কাজ করে? আপনি 19 বা 20 এ চেষ্টা করেছেন?
ডাইভার্স

আপনি কীভাবে এক্সএমএলে ব্যবহার drawableRightকরবেন তা দেখাতে পারেন TextView?
ডাইভার্স

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

1
এটি কাজ করছে না, আপনি সরাসরি এক্সএমএলে
টেক্সটভিউয়ের

এটি এপিআই 19 এবং 20-এ পরীক্ষা করুন instead মোহন মত কাজ!
রেড এম


5

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

Drawable drawableTop = AppCompatResources.getDrawable(view.getContext(), iconId);
view.setCompoundDrawablesWithIntrinsicBounds(null, drawableTop, null, null);

আশা করি এটি আপনাকে সাহায্য করবে।


প্রাক Lডিভাইসগুলির সাথে সামঞ্জস্যপূর্ণ নয় ।
সাকিবয়

@ সাকিবয় হ্যাঁ, এটি হ'ল আমি এই কোডটি ন্যূনতম এপিআই সহ 17 ব্যবহার করছি
রাহুল শর্মা

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

4

আমি এটির জন্য একটি ছোট গ্রন্থাগার ডিজাইন করেছি - পাঠ্যদর্শন সমৃদ্ধ-অঙ্কনযোগ্য (এটি যৌগিক-অঙ্কনযোগ্য আকার এবং রঙিন সংজ্ঞাও সমর্থন করে)।

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:compoundDrawableHeight="24dp"
    app:compoundDrawableWidth="24dp"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable"
    app:drawableTint="@color/colorAccent" />

এবং নির্ভরতা

compile 'com.tolstykh.textviewrichdrawable:textview-rich-drawable:0.3.2'

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


3

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

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

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


2

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

android:drawableTop
android:drawableBottom
etc

কারণ এটি নাল ইন দিয়ে প্রতিস্থাপন করা হবে

Drawable drawableTop = null;
...
setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);

যদি app:drawableTopCompatসেট না করা থাকে তবে এটি ছিল android:drawableTop(উদাহরণস্বরূপ)।

এখানে সম্পূর্ণ সমাধান:

public class CustomTextView extends AppCompatTextView {
    private static final int NOT_SET = -1;
    private static final int LEFT = 0;
    private static final int START = 0;
    private static final int TOP = 1;
    private static final int RIGHT = 2;
    private static final int END = 2;
    private static final int BOTTOM = 3;

    public CustomTextView(Context context) {
        super(context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initAttrs(context, attrs);
    }

    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(context, attrs);
    }

    void initAttrs(Context context, AttributeSet attrs) {
        if (attrs == null) {
            return;
        }
        Drawable[] drawablesArr = getCompoundDrawables();

        TypedArray attributeArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView);
        Drawable drawableStart = null;
        Drawable drawableEnd = null;
        Drawable drawableBottom = null;
        Drawable drawableTop = null;
        Drawable drawableLeft = null;
        Drawable drawableRight = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            drawableStart = attributeArray.getDrawable(R.styleable.CustomTextView_drawableStartCompat);
            drawableEnd = attributeArray.getDrawable(R.styleable.CustomTextView_drawableEndCompat);
            drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat);
            drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat);
            drawableLeft = attributeArray.getDrawable(R.styleable.CustomTextView_drawableLeftCompat);
            drawableRight = attributeArray.getDrawable(R.styleable.CustomTextView_drawableRightCompat);
        } else {
            final int drawableStartId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableStartCompat, NOT_SET);
            final int drawableEndId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableEndCompat, NOT_SET);
            final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, NOT_SET);
            final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, NOT_SET);
            final int drawableLeftId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableLeftCompat, NOT_SET);
            final int drawableRightId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableRightCompat, NOT_SET);

            if (drawableStartId != NOT_SET)
                drawableStart = AppCompatResources.getDrawable(context, drawableStartId);
            if (drawableLeftId != NOT_SET)
                drawableLeft = AppCompatResources.getDrawable(context, drawableLeftId);
            if (drawableEndId != NOT_SET)
                drawableEnd = AppCompatResources.getDrawable(context, drawableEndId);
            if (drawableRightId != NOT_SET)
                drawableRight = AppCompatResources.getDrawable(context, drawableRightId);
            if (drawableBottomId != NOT_SET)
                drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId);
            if (drawableTopId != NOT_SET)
                drawableTop = AppCompatResources.getDrawable(context, drawableTopId);
        }

        drawableStart = (drawableStart != null ? drawableStart : drawablesArr[START]);
        drawableLeft = (drawableLeft != null ? drawableLeft : drawablesArr[LEFT]);
        drawableStart = (drawableStart != null ? drawableStart : drawableLeft);

        drawableEnd = (drawableEnd != null ? drawableEnd : drawablesArr[END]);
        drawableRight = (drawableRight != null ? drawableRight : drawablesArr[RIGHT]);
        drawableEnd = (drawableEnd != null ? drawableEnd : drawableRight);

        drawableBottom = (drawableBottom != null ? drawableBottom : drawablesArr[BOTTOM]);
        drawableTop = (drawableTop != null ? drawableTop : drawablesArr[TOP]);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, drawableTop, drawableEnd, drawableBottom);
        } else {
            setCompoundDrawables(drawableStart, drawableTop, drawableEnd, drawableBottom);
        }

        attributeArray.recycle();
    }
}

এটি উত্তর গ্রহণ করা উচিত। সাধারণ পিএনজি ফাইল এবং অ্যাট্রিবিউটস ড্রইং টপ, ড্রইবলবটম দিয়ে কাজ করুন accepted
ভার্গব পান্ড্য

2

Build.gradle (অ্যাপ) ফাইলে

android {
    compileSdkVersion 26
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }

    dataBinding {
        enabled = true
    }
}

...

public class BindingUtils {
    @BindingAdapter("android:drawableRight")
    public static void setDrawableStart(TextView textView, int resourceId) {
        Drawable drawable = AppCompatResources.getDrawable(textView.getContext(), resourceId);
        Drawable[] drawables = textView.getCompoundDrawables();
        textView.setCompoundDrawablesWithIntrinsicBounds(drawable,
                drawables[1], drawables[2], drawables[3]);
    } 
}

ব্যবহার (যখন ডেটাবাইন্ডিং)

android:drawableRight="@{viewModel.ResId}"

বা (সাধারণ)

android:drawableRight="@{@drawable/ic_login_24dp}"

1

ভেক্টর ড্রয়াবল ব্যবহার করে

kotlin

 val drawable1 = VectorDrawableCompat.create(resources, R.drawable.ic_rb_username, theme)
        yourView.setCompoundDrawablesRelativeWithIntrinsicBounds( drawable1, null, null, null)

জাভা

  Drawable drawable1 = VectorDrawableCompat.create(getResources(), R.drawable.ic_rb_username, getTheme());
        yourView.setCompoundDrawablesRelativeWithIntrinsicBounds( drawable1, null, null, null);

1

পিছিয়ে সামঞ্জস্যের ব্যবহারের জন্য:

TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, left, top, right, bottom)

0

আমি এই সমস্যা সমাধানের জন্য বাইন্ডিং অ্যাডাপ্টার ব্যবহার করছি

@JvmStatic
@BindingAdapter("drawableSvgLeft")
fun addDrawableSvgLeft(textView: TextView,drawable: Drawable){
    textView.setCompoundDrawablesWithIntrinsicBounds(drawable,null,null,null)
}

@JvmStatic
@BindingAdapter("drawableSvgRight")
fun addDrawableSvgRight(textView: TextView,drawable: Drawable){
    textView.setCompoundDrawablesWithIntrinsicBounds(null,null,drawable,null)
}

এবং আমার লেআউটে এইভাবে ব্যবহার করে

<TextView
  drawableSvgRight="@{@drawable/svg_ic_battle_trophy}"
  .....

সম্ভবত vectorDrawables.useSupportLibrary = ডিফল্ট কনফিগারেশনে সত্য প্রয়োজন

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