我想浏览android来源以了解错误原因。我有与android设备version 4.4.4
相同的android设备API 19
。我下载了API级别19的资源(通过sdk管理器),并希望找到导致错误的代码。
在logcat中,我有错误:
12-16 16:51:03.790: E/AndroidRuntime(10349): java.lang.NullPointerException
12-16 16:51:03.790: E/AndroidRuntime(10349): at android.widget.TextView.checkForRelayout(TextView.java:6596)
12-16 16:51:03.790: E/AndroidRuntime(10349): at android.widget.TextView.onRtlPropertiesChanged(TextView.java:8716)
12-16 16:51:03.790: E/AndroidRuntime(10349): at android.view.View.resolvePadding(View.java:12538)
但是问题是TextView类内的第6596行是:
} else {
8716行是注释。因此,cources并不对应于错误。如何找到正确的来源?
另外,请检查设备Build.VERSION.SDK_INT is 19
。设备- Sony Xperia tablet
。
完整日志12-16 17:30:43
.401: E/AndroidRuntime(19327): java.lang.NullPointerException
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.TextView.checkForRelayout(TextView.java:6596)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.TextView.onRtlPropertiesChanged(TextView.java:8716)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.resolvePadding(View.java:12538)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.resolveRtlPropertiesIfNeeded(View.java:12289)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.measure(View.java:16639)
12-16 17:30:43.401: E/AndroidRuntime(19327): at com.cooperok.gui.views.tablefixheader.TableFixHeaders.makeView(TableFixHeaders.java:741)
12-16 17:30:43.401: E/AndroidRuntime(19327): at com.cooperok.gui.views.tablefixheader.TableFixHeaders.makeAndSetup(TableFixHeaders.java:698)
12-16 17:30:43.401: E/AndroidRuntime(19327): at com.cooperok.gui.views.tablefixheader.TableFixHeaders.onLayout(TableFixHeaders.java:601)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.View.layout(View.java:14965)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewGroup.layout(ViewGroup.java:4631)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5622)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.Choreographer.doFrame(Choreographer.java:544)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.os.Handler.handleCallback(Handler.java:733)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.os.Handler.dispatchMessage(Handler.java:95)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.os.Looper.loop(Looper.java:212)
12-16 17:30:43.401: E/AndroidRuntime(19327): at android.app.ActivityThread.main(ActivityThread.java:5135)
12-16 17:30:43.401: E/AndroidRuntime(19327): at java.lang.reflect.Method.invokeNative(Native Method)
12-16 17:30:43.401: E/AndroidRuntime(19327): at java.lang.reflect.Method.invoke(Method.java:515)
12-16 17:30:43.401: E/AndroidRuntime(19327): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
12-16 17:30:43.401: E/AndroidRuntime(19327): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
12-16 17:30:43.401: E/AndroidRuntime(19327): at dalvik.system.NativeStart.main(Native Method)
为了解决我的问题,我查看了原始的android源代码,发现NullPointerException只有两个可能的变体,因此很容易猜出问题出在哪里
/**
* Check whether entirely new text requires a new view layout
* or merely a new text layout.
*/
private void checkForRelayout() {
// If we have a fixed width, we can just swap in a new text layout
// if the text height stays the same or if the view height is fixed.
if ((mLayoutParams.width != LayoutParams.WRAP_CONTENT ||
(mMaxWidthMode == mMinWidthMode && mMaxWidth == mMinWidth)) &&
(mHint == null || mHintLayout != null) &&
(mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight() > 0)) {
// Static width, so try making a new text layout.
int oldht = mLayout.getHeight();
int want = mLayout.getWidth();
int hintWant = mHintLayout == null ? 0 : mHintLayout.getWidth();
/*
* No need to bring the text into view, since the size is not
* changing (unless we do the requestLayout(), in which case it
* will happen at measure).
*/
makeNewLayout(want, hintWant, UNKNOWN_BORING, UNKNOWN_BORING,
mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight(),
false);
if (mEllipsize != TextUtils.TruncateAt.MARQUEE) {
// In a fixed-height view, so use our new text layout.
if (mLayoutParams.height != LayoutParams.WRAP_CONTENT &&
mLayoutParams.height != LayoutParams.MATCH_PARENT) {
invalidate();
return;
}
// Dynamic height, but height has stayed the same,
// so use our new text layout.
if (mLayout.getHeight() == oldht &&
(mHintLayout == null || mHintLayout.getHeight() == oldht)) {
invalidate();
return;
}
}
// We lose: the height has changed and we have a dynamic height.
// Request a new view layout using our new text layout.
requestLayout();
invalidate();
} else {
// Dynamic width, so we have no choice but to request a new
// view layout with a new text layout.
nullLayouts();
requestLayout();
invalidate();
}
}
在我的情况下,TextView是通过编程方式创建的,而mLayoutParams为null,因此可以通过将LayoutParams设置为view来解决问题。
但是供应商可以更改android源并且不显示这些更改,这一点太糟糕了(实际上我没有找到有关Sony的任何信息)。我以为他们只更改内核。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句