【问题标题】:how to use custom ImageView如何使用自定义 ImageView
【发布时间】:2013-09-04 22:25:59
【问题描述】:

我找到了以下关于如何从 ImageView 获取显示高度和宽度的代码:Trying to get the display size of an image in an ImageView。当我尝试在下面的布局 sn-p 中使用它时,出现以下错误。

 <com.mycompany.widget.SizeAwareImageView
                android:id="@+id/account_profile_img"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="@drawable/avatar"
                android:clickable="true"
                android:gravity="bottom|center_horizontal"
                android:onClick="onEditPhotoClicked" />

错误:

FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.myapp/com.company.myapp.RegisterActivity}: android.view.InflateException: Binary XML file line #218: Error inflating class com.company.myapp.widget.SizeAwareImageView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
    at android.app.ActivityThread.access$700(ActivityThread.java:152)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5328)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.InflateException: Binary XML file line #218: Error inflating class com.company.myapp.widget.SizeAwareImageView
    at android.view.LayoutInflater.createView(LayoutInflater.java:602)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:760)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:327)
    at android.app.Activity.setContentView(Activity.java:1928)
    at com.company.myapp.RegisterActivity.onCreate(RegisterActivity.java:63)
    at android.app.Activity.performCreate(Activity.java:5250)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
    ... 11 more
 Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
    at java.lang.Class.getConstructorOrMethod(Class.java:460)
    at java.lang.Class.getConstructor(Class.java:431)
    at android.view.LayoutInflater.createView(LayoutInflater.java:567)
    ... 25 more

更新

从图形布局我也得到了错误

java.lang.NullPointerException
Exception details are logged in Window > Show View > Error Log

java.lang.NullPointerException
    at com.company.myapp.widget.SizeAwareImageView.onMeasure(SizeAwareImageView.java:66)
    at android.view.View.measure(View.java:15848)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
    at android.view.View.measure(View.java:15848)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:15848)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:477)
    at android.view.View.measure(View.java:15848)
    at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1217)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.widget.ScrollView.onMeasure(ScrollView.java:321)
    at android.view.View.measure(View.java:15848)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.view.View.measure(View.java:15848)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:15848)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:15848)

第二次更新

有问题的错误行是第二行

final Drawable d = getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();

完整的代码在 Trying to get the display size of an image in an ImageView 的堆栈溢出中。这是得票最多的回应。

【问题讨论】:

  • 看起来没有 SizeAwareImageView(Context context,AttributeSet attr) 构造函数或者你的类路径错误
  • 谢谢。 +1。现在我遇到了一个新错误。请参阅我的更新部分
  • 您的跟踪显示 SizeAwareImageView.java:66 这意味着您的问题是第 66 行的 NPE。您需要从 SizeAwareImageView 发布相关方法,以便任何人能够帮助您
  • 我已经提供了链接。它实际上是堆栈溢出的代码 sn-p。但无论如何我都会添加sn-p。
  • @jqpubliq 有什么想法吗?

标签: android android-layout android-imageview


【解决方案1】:

确保您为 XML 提供了正确的构造函数。您的自定义 Views 构造函数应具有以下方法签名:

public SizeAwareImageView(Context context, AttributeSet attrs){
  // todo
}

我猜它目前看起来像这样:

public SizeAwareImageView(Context context){
  // todo
}

我还要仔细检查您是否要设置 XML 参数 android:background,对于 ImageView,您实际上设置了 android:src

【讨论】:

  • 谢谢。 +1。现在我遇到了一个新错误。请参阅我的更新部分
  • 啊。我忘记了src。现在它正在工作。除非我尝试获取宽度和高度,否则我的值可以小于零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多