Android:LinearLayout $ LayoutParams.<init>上的java.lang.NoSuchMethodError

ged*_*fme 4 android android-layout

我正在尝试在a周围添加边距TextView,并编写了以下内容:

TextView t = (TextView)getLayoutInflater().inflate(R.layout.plaintexttable, null);
t.setText(new String(cp.decryptChar(words[i].charAt(l))+""));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new    LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
params.setMargins(2,2,2,2);
t.setLayoutParams(params);
plainRow.addView(t);
Run Code Online (Sandbox Code Playgroud)

运行代码时,我得到的LinearLayout.LayoutParams定义错误如下:

01-18 05:50:41.228: E/AndroidRuntime(1950): java.lang.NoSuchMethodError: android.widget.LinearLayout$LayoutParams.<init>
01-18 05:50:41.228: E/AndroidRuntime(1950):     at com.napoleonicmonkey.cryptopuzzle.PuzzleScreen.refreshPuzzle(PuzzleScreen.java:97)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at com.napoleonicmonkey.cryptopuzzle.PuzzleScreen.onGlobalLayout(PuzzleScreen.java:61)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:655)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1748)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.Choreographer.doFrame(Choreographer.java:532)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.os.Handler.handleCallback(Handler.java:725)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.os.Looper.loop(Looper.java:137)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at java.lang.reflect.Method.invokeNative(Native Method)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at java.lang.reflect.Method.invoke(Method.java:511)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-18 05:50:41.228: E/AndroidRuntime(1950):     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

此错误通常与在较新版本的Android中添加的方法有关,但据我所知,LinearLayout.LayoutParams自API 1以来一直存在.

还有什么可能导致它?

mat*_*kin 19

我遇到了类似的错误.这个答案可能对某些人有用.它也可以应用于FrameLayout.

我想VM找不到,LayoutParams(ViewGroup.LayoutParams p)但是找不到LayoutParams (LinearLayout.LayoutParams source)API 19提供的构造函数.

这种情况可能是你的PuzzleScreenexdends LinearLayout.代码可以使用构建目标19进行编译,但在较旧的Android版本上崩溃.编译器将第二个方法签名放入bytecode,但此方法在设备上并不可用.当目标小于19时,编译器会放置正确的签名(预期行为),以便代码在任何地方运行良好.

因此,解决方案是使用较旧的目标API或手动进行强制转换,例如:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((ViewGroup.MarginLayoutParams)(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)));
Run Code Online (Sandbox Code Playgroud)