带有xml图标的DrawableLeft

时间:2018-04-23 16:26:40

标签: android android-layout

如何使用带有xml图标的drawableLeft?我有以下按钮:

<Button
   android:id="@+id/vitimas"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginBottom="10dp"
   android:layout_marginLeft="20dp"
   android:layout_marginRight="20dp"
   android:drawableLeft="@drawable/ic_person_black_24dp"
   android:drawableStart="@drawable/ic_person_black_24dp"
   android:background="@drawable/botao_verde"
   android:text="Vítimas"/>

在旧版API(例如16)中,应用因drawableLeft而停止工作,我尝试使用ImageButton,但同样的情况发生,如果我使用app: srcCompat它可行,但是图标不是留在左边,我需要它留在左边,文字在中间

图标来自矢量资产包。

5 个答案:

答案 0 :(得分:2)

发现的最佳方式:

static public void setLeftDrawable(View view, Context c, int drawable) {
        Drawable leftDrawable = AppCompatResources.getDrawable(c, drawable);

        if (view instanceof TextInputEditText) {
            ((TextInputEditText) view).setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

        } else if (view instanceof BootstrapEditText) {
            ((BootstrapEditText) view).setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

        } else if (view instanceof EditText) {
            ((EditText) view).setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

        } else if (view instanceof TextView) {
            ((TextView) view).setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);
        }
    }

然后只需调用即可传递View,Context和Drawable,非常简单!

答案 1 :(得分:2)

AppCompatTextView now支持app:drawableTopCompatapp:drawableRightCompatapp:drawableBottomCompatapp:drawableStartCompatapp:drawableEndCompat和{{1 }}复合可绘制对象,支持向后移植的可绘制类型,例如 VectorDrawableCompat

将此内容添加到您的gradle文件中

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

您可以在文本视图中使用

app:drawableLeftCompat
app:drawableStartCompat

答案 2 :(得分:-1)

将此添加到您的gradle文件中

 android {
   defaultConfig {
     vectorDrawables.useSupportLibrary = true
    }
 }

答案 3 :(得分:-1)

旧版本仍然不支持TextView等视图中的矢量绘图。

为此,您需要使用方法setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)将可绘制内容添加到TextViewCheckboxView等。

TextView tv = findViewById(R.id.tv);
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

不要仅仅为了获得这种效果而嵌套视图,这对于性能和不必要都是不利的。

有关类似方法的列表,请参阅docs

答案 4 :(得分:-1)

这里我添加了gradle的代码:

 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }
将此代码添加到应用程序类后

 @Override
public void onCreate() {
    super.onCreate();
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

之后为vector drawable创建一个图层文件:

ic_person_black.xml

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

现在您可以将此文件添加到可绘制的左侧。

android:drawableLeft="@drawable/ic_person_black.xml"