如何将材料组件库中的芯片添加到android中的输入字段?

艾米凯尔

我已经看到,在android-P中,google添加了包含材料芯片的新材料组件库:

Android的材质组件

Material.io芯片使用情况

GitHub上的材料组件

因此,我决定将材料输入芯片添加到我的项目中,但不幸的是没有找到任何教程来实现这一目标。我想创建类似Gmail芯片的内容,但一开始没有图像。

因为我使用的是appcompat库,所以我尝试通过android.support.design.chip.Chip使用材料芯片android.support.design.chip.ChipGroup但是结果就是没有任何输入字段的芯片。此外,我试图创建一个独立ChipDrawable然后将其添加到EditText使用

Editable text = editText.getText();

text.setSpan(span, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

但是我没有任何芯片的空EditText。那么,如何使用该材料组件库在Gmail中创建筹码输入呢?也许有人有经验或知道任何教程,我可以看到如何创建它?

提前致谢!

穆罕默德(Mohamed Mohaideen)AH

回答

没有用于在android中添加芯片的默认输入字段。他们提到了输入芯片,但我没有找到任何输入芯片的布局或视图组。所以我用Chipdrawable在edittext中添加芯片的方法来做。在这里,您可以使用AppCompatEdittext更改为可以监听文本输入的任何视图。参考

步骤1

添加芯片xml资源。chip.xml

res-> xml-> chip.xml

<?xml version="1.0" encoding="utf-8"?>
<chip xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:textAppearance="@style/ChipTextApperance"
 app:chipBackgroundColor="@color/colorAccent"
 app:chipIcon="@drawable/ic_call_white_24dp"
 app:closeIconEnabled="true"  <!--property for close icon if no need set to false. -->
 app:closeIconTint="@android:color/white" />

然后在style.xml中添加textappearance样式(用于更改textStyle)

<style name="ChipTextApperance" parent="TextAppearance.MaterialComponents.Chip">
    <item name="android:textColor">@android:color/white</item>
</style>

第2步

使用AppCompatEdittext在此处添加视图

  <android.support.v7.widget.AppCompatEditText
    android:id="@+id/phone"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tvt_Contact" />

步骤3
将此代码添加到您的视图中以获得所需的行为。

 private int SpannedLength = 0,chipLength = 4;

 AppCompatEditText Phone = findViewById(R.id.phone);

 Phone.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (charSequence.length() == SpannedLength - chipLength)
            {
                SpannedLength = charSequence.length();
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {

            if(editable.length() - SpannedLength == chipLength) {
                ChipDrawable chip = ChipDrawable.createFromResource(getContext(), R.xml.chip);
                chip.setChipText(editable.subSequence(SpannedLength,editable.length()));
                chip.setBounds(0, 0, chip.getIntrinsicWidth(), chip.getIntrinsicHeight());
                ImageSpan span = new ImageSpan(chip);
                editable.setSpan(span, SpannedLength, editable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                SpannedLength = editable.length();
            }

        }
    });

当需要在edittext中添加新芯片时,根据您的需要更改chipLength。

输出值

在此处输入图片说明

已编辑

您可以在此处找到有关如何使文本居中对齐的更多信息

在这里,我从解决方案中添加了一些代码,可以为您解决..

public class VerticalImageSpan extends ImageSpan {

public VerticalImageSpan(Drawable drawable) {
    super(drawable);
}

@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end,
                   Paint.FontMetricsInt fontMetricsInt) {
    Drawable drawable = getDrawable();
    Rect rect = drawable.getBounds();
    if (fontMetricsInt != null) {
        Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
        int fontHeight = fmPaint.descent - fmPaint.ascent;
        int drHeight = rect.bottom - rect.top;
        int centerY = fmPaint.ascent + fontHeight / 2;

        fontMetricsInt.ascent = centerY - drHeight / 2;
        fontMetricsInt.top = fontMetricsInt.ascent;
        fontMetricsInt.bottom = centerY + drHeight / 2;
        fontMetricsInt.descent = fontMetricsInt.bottom;
    }
    return rect.right;
}

@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end,
                 float x, int top, int y, int bottom, @NonNull Paint paint) {

    Drawable drawable = getDrawable();
    canvas.save();
    Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();
    int fontHeight = fmPaint.descent - fmPaint.ascent;
    int centerY = y + fmPaint.descent - fontHeight / 2;
    int transY = centerY - (drawable.getBounds().bottom - drawable.getBounds().top) / 2;
    canvas.translate(x, transY);
    drawable.draw(canvas);
    canvas.restore();
}

}

并如下更改您的imagespan类

VerticalImageSpan span = new VerticalImageSpan(chip);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将v模型添加到组件中动态添加的html输入中

将材料添加到列表

如何将材料设计库导入Android Studio?

如何将 SCSS 添加到角度库的组件中

将材料Ui类名称替换或添加到React Data Table组件类名称

如何将按钮的输入值添加到jQuery中的两个不同的输入字段中

如何将结构中的字段添加到数组?

如何将文本从EditText字段添加到android studio中的不同TextViews

如何将新数据添加到 android 中的 Firebase 数据库?

RealityKit –以编程方式将材料添加到ModelEntity

将材料设计图标添加到按钮

如何将行添加到带有行数组的角度的动态材料表中

如何将两种材料添加到画布上已经渲染的网格中

如何将类添加到表单输入字段?

如何将多个文件扩展名添加到文件:Foreach 循环容器 SSIS 中的输入字段

如何将输入中的输入值添加到表单操作中?

如何将组件动态添加到服务中的另一个组件

如何将字符串添加到 Transform Message 组件中的 Java 列表中?

如何将(文本)字段添加到 pgsync/elasticsearch 中的所有字段?

如何将动态添加的输入框的值添加到数组中?

如何将表中的字段添加到SELECT的结果中以创建新视图?

如何将文本字段中的值添加到 eclipse 中的 jcombobox

如何将用户输入添加到清单中,然后将其放置在标签中?

如何将输入中的值和使用 JS 创建的元素添加到列表中?

如何将用户输入中的列添加到现有数据框中?

如何将范围输入中的值添加到总额中?

如何将用户输入永久添加到SQL表中的PHP变量中

如何将javascript中的用户输入添加到html中

如何将材质图标添加到 Angular 数据表标题