【问题标题】:Problem previewing custom TextInputLayout预览自定义 TextInputLayout 时出现问题
【发布时间】:2018-11-25 13:52:06
【问题描述】:

我创建了一个自定义视图,它封装了TextInputLayoutTextInputEditText。 该视图似乎在模拟器和硬件设备上都正确呈现。 但是当我在 Android Studio 中打开预览面板时,自定义视图无法正确呈现。

以下是我收到的任何提示的错误。

  • Couldn't resolve resource @string/path_password_strike_through
  • <transition> tag requires a 'drawable' attribute or child tag defining a drawable
  • android.view.InflateException:无法从@string/path_password_eye_mask_strike_through 变形为@string/path_password_eye_mask_visible 在 android.animation.AnimatorInflater.getPVH(AnimatorInflater.java:308) 在 android.animation.AnimatorInflater.parseAnimatorFromTypeArray(AnimatorInflater.java:422) 在 android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:1053) 在 android.animation.AnimatorInflater.loadObjectAnimator(AnimatorInflater.java:1011) 在 android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:667) 在 android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:642) 在 android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:126) 在 android.graphics.drawable.AnimatedVectorDrawable.inflate(AnimatedVectorDrawable.java:565) 在 android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142) 在 android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332) 在 android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291) 在 android.graphics.drawable.Drawable.createFromXml(Drawable.java:1266) 在 com.android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.java:330) 在 android.content.res.BridgeTypedArray.getDrawable(BridgeTypedArray.java:684) 在 android.graphics.drawable.AnimatedStateListDrawable.parseTransition(AnimatedStateListDrawable.java:473) 在 android.graphics.drawable.AnimatedStateListDrawable.inflateChildElements(AnimatedStateListDrawable.java:455) 在 android.graphics.drawable.AnimatedStateListDrawable.inflate(AnimatedStateListDrawable.java:385) 在 android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142) 在 android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332) 在 android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291) 在 android.graphics.drawable.Drawable.createFromXml(Drawable.java:1266) 在 com.android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.java:330) 在 android.content.res.Resources_Delegate.getDrawable(Resources_Delegate.java:186) 在 android.content.res.Resources.getDrawable(Resources.java:827) 在 android.content.Context.getDrawable(Context.java:626) 在 androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:463) 在 androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:203) 在 androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:191) 在 androidx.appcompat.content.res.AppCompatResources.getDrawable(AppCompatResources.java:102) 在 androidx.appcompat.widget.TintTypedArray.getDrawable(TintTypedArray.java:76) 在 com.google.android.material.textfield.TextInputLayout.(TextInputLayout.java:344) 在 com.google.android.material.textfield.TextInputLayout.(TextInputLayout.java:247) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:401) 在 org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:184) 在 org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:142) 在 com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:229) 在 android.view.BridgeInflater.loadCustomView(BridgeInflater.java:421) 在 android.view.BridgeInflater.loadCustomView(BridgeInflater.java:432) 在 android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:336) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:394) 在 com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:327) 在 com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:386) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:193) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:450) 在 com.android.tools.idea.rendering.RenderTask.lambda$inflate$3(RenderTask.java:590) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

已编辑(添加代码示例)

自定义视图:



    public class MaterialTextInputView extends TextInputLayout {

      private TextInputEditText editText;

      public MaterialTextInputView(Context context) {
        super(context);
        init(context);
      }

      public MaterialTextInputView(Context context, AttributeSet) {
        super(context, attrs);

        init(context);
      }

      public MaterialTextInputView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
      }

      private void init(Context context) {
        TextInputEditText editText = new TextInputEditText(getContext());
        editText.setId(ViewCompat.generateViewId());

        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

        this.editText = editText;

        addView(this.editText, params);
        setErrorEnabled(true);
      }
    }

xml 中的示例用法:

<com.marian.caloriecounter.ui.common.MaterialTextInputView
        android:id="@+id/foo"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="bar"
        style="@style/TextInputLayout"/>

【问题讨论】:

  • 你找到解决办法了吗?

标签: android android-textinputlayout


【解决方案1】:

确保您已在字符串文件中声明变量未解析,如 string/path_password_strike_through 以及可绘制文件夹中的可绘制对象

如果没有你的代码,它会很模棱两可......如果你分享它会很容易帮助

【讨论】:

  • 我已经添加了一个示例实现以及它是如何使用的,奇怪的是我的代码没有引用缺少的资源。
  • 我的预览面板日志中有同样的错误,但它加载预览很好,尝试强制刷新布局,这似乎是一个错误,将在几天后发布的下一个测试版中修复以前
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2019-11-01
相关资源
最近更新 更多