2014-01-18 4 views
4

Я пытаюсь добавить поля вокруг 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); 

При выполнении кода, я получаю сообщение об ошибке на 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) 

Этот ошибка, как правило, связана с тем, что методы добавляются в новые версии Android, но насколько я вижу, LinearLayout.LayoutParams существует с тех пор, как API 1.

Что еще coul d вызвать его?

+0

Вы можете отправить полную статистику стека ... укажите, какой метод точно не найден ... –

+0

попробуйте с параметрами родительского макета. Я имею в виду, если ваш текст просматривается внутри относительного макета, попробуйте с относительной компоновкой. Но я не уверен. Просто попробуйте и дайте мне знать, если он работает или нет. – nilkash

+0

Можете ли вы разместить свой onCreate menthod? – VikramV

ответ

18

Я столкнулся с аналогичной ошибкой. Этот ответ может быть полезен для кого-то. Также он может применяться к FrameLayout, например.

Я полагаю, что ВМ не может найти не LayoutParams(ViewGroup.LayoutParams p) но LayoutParams (LinearLayout.LayoutParams source) конструктор, который доступен из API 19.

Эта ситуация может быть, если ваши PuzzleScreen exdends LinearLayout. Код может быть скомпилирован с целью сборки 19, но сбой на старой версии Android. Компилятор ставит вторую подпись метода в bytecode, но этот метод на самом деле не доступен на устройствах. Когда цель меньше 19, компилятор помещает правильную подпись (ожидаемое поведение) так, чтобы код работал хорошо везде.

Таким образом, решение заключается в использовании устаревшей целевой API или сделать бросок вручную, например:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((ViewGroup.MarginLayoutParams)(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))); 
+0

Но это решение не работает, если мы хотим установить l ayout_margins или layout_gravity программно. Любое предложение? –

+0

Что значит? Вопрос и ответ связаны с программным программированием LP. – matreshkin

1

Я темп (источник) LayoutParams, то я хочу, чтобы скопировать значение источника LayoutParams к новому LayoutParams. Мое решение:

 LayoutParams newParams = null; 
     if(AppUtils.getCurrentSdkVersion() < 19) { 
      MarginLayoutParams p = sourceParams; 
      newParams = new LayoutParams(p); 
      newParams.width = sourceParams.width; 
      newParams.height = sourceParams.height; 
     } else { 
      newParams = new LayoutParams(sourceParams); 
     } 
Смежные вопросы