【问题标题】:image button with selector in android studio error renderingandroid studio错误渲染中带有选择器的图像按钮
【发布时间】:2014-12-14 13:31:46
【问题描述】:

我用选择器制作了一个带有按下效果的按钮。我正在使用android studio, 当我使用 eclipse 它运行良好.. 但是,当我在 android studio 中尝试时,日志一直显示错误..

这是我的日志:

java.lang.NullPointerException
at android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java:614)
at android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java:122)
at android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java:104)
at com.android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.java:249)
at android.content.res.BridgeTypedArray.getDrawable(BridgeTypedArray.java:674)
at android.view.View.<init>(View.java:3730)
at android.widget.ImageView.<init>(ImageView.java:139)
at android.widget.ImageButton.<init>(ImageButton.java:86)
at android.widget.ImageButton.<init>(ImageButton.java:82)
at android.widget.ImageButton.<init>(ImageButton.java:78)
at sun.reflect.GeneratedConstructorAccessor75.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.
   newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.BridgeInflater.onCreateView(BridgeInflater.java:82)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:128)
at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:806)
at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:782)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:400)
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:332)
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:688)
at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:677)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932)
at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:677)
at com.android.tools.idea.rendering.RenderService.render(RenderService.java:815)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.
   doRender(AndroidLayoutPreviewToolWindowManager.java:646)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.
   access$1700(AndroidLayoutPreviewToolWindowManager.java:82)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.
   run(AndroidLayoutPreviewToolWindowManager.java:589)
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress
   (ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress
   (ProgressManagerImpl.java:212)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess
    (ProgressManagerImpl.java:171)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run
   (AndroidLayoutPreviewToolWindowManager.java:584)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
at com.intellij.util.Alarm$Request$1.run(Alarm.java:327)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

这是我的选择器:

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

<item android:state_pressed="true" android:drawable="@drawable/press_pdgmap" /> <!-- pressed -->
<item android:state_focused="true" android:drawable="@drawable/hover_pdgmap2" /> <!-- hover -->

<item android:drawable="@drawable/hover_pdgmap" /> <!-- default -->

</selector>

在我的活动中我使用:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageButton"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:background="@drawable/selector"
    android:clickable="true" />

在我的活动中,红色标记一直显示在“android:background="@drawable/selector" 行中。

我有可绘制的移动图像和选择器文件,我做错了什么?

注意:如果我的解释不好,请见谅。

【问题讨论】:

  • @bluefeet,我明白你的意思;我已经链接了我的其他答案。

标签: android android-studio android-selector


【解决方案1】:

我在 Android Studio 中遇到了同样的行为。 看来问题在于如果您不调用文件 name.xml,Android Studio 新文件选项不会将文件扩展名添加到 xml 文件。 只需确保 \res\drawable\ 下的选择器 xml 确实具有 .xml 扩展名。

注意:如果它们没有所需的扩展名,自动完成(对于图像文件)似乎也将不起作用,但如果您指定完整的文件名和路径(同样如果您粘贴来自某处错误不会显示)。当您将选择器设置为布局中的按钮时,自动完成也将不起作用,但如果您再次指定全名,它只会显示带有 x 的红色圆圈,但不会告诉您问题所在。

【讨论】:

    【解决方案2】:

    根据堆栈跟踪,问题出在图像按钮中。 尝试清理和构建项目,并查看您在选择器中使用的图像是否为有效格式,如果不是,则在呈现可能导致错误的图像按钮时会出现问题。

    【讨论】:

    • 我已经尝试过了.. 清理并重建.. 但仍然出错,日志显示渲染问题,'在 android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java: 614) 在 android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java:122) 在 android.graphics.Bitmap_Delegate.createBitmap(Bitmap_Delegate.java:104)'
    • 你检查过你在选择器中使用过的图片吗?
    • 我找到了答案,它适用于我的选择器,请参阅此pic 以获得答案,我应该将其放入答案中吗? @Hardik
    【解决方案3】:

    我将按钮的自定义选择器的代码更改为此

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:state_pressed="true">
        <bitmap android:src="@drawable/press" />
    </item>
    
    <item android:state_focused="true">
        <bitmap android:src="@drawable/notpress" />
    </item>
    
    <item>
        <bitmap android:src="@drawable/notpress" />
    </item>
    </selector>
    

    而且它的工作 你可以看看我的安卓工作室pic

    注意:我正在使用 Android Studio v1.0.1 并将我的 SDK 更新到最新版本

    【讨论】:

      【解决方案4】:

      这适用于我的应用。试试这个。

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

      【讨论】:

        猜你喜欢
        • 2018-01-24
        • 1970-01-01
        • 2020-08-23
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多