2013-06-12 3 views
0

Я пытаюсь добавить LinearLayout, представляющий небольшую панель, содержащую некоторые элементы, к основному AbsoluteLayout моего Activity. Я использую этот код, но приложение выходит из строя, это конструктор класса панели, который должен добавить представление в основной макет. Аналогичный код работает, чтобы добавить созданные кнопки времени выполнения, но не будет работать для этого.Android: как добавить макет в AbsoluteLayout

public ButtonSetupPanel(String btnName, int keyCode, View v){ 
    AbsoluteLayout abs = (AbsoluteLayout) v.findViewById(R.id.mainbg); 
    LinearLayout panel = (LinearLayout) v.findViewById(R.id.btnSetupPanel); 
    panel.setLayoutParams(new AbsoluteLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, 1023, 300)); 
    panel.setOnTouchListener(this); 
    abs.addView(panel); 
} 

LogCat: (Я использую библиотеку Standout)

06-12 22: 43: 22,268: Е/AndroidRuntime (8146): неустранимый: Главный 06-12 22:43: 22.268: E/AndroidRuntime (8146): java.lang.RuntimeException: не удалось запустить службу [email protected] с намерением {act = SHOW cmp = com.vektor.amapper/.windows. MainWindow (имеет дополнительные функции)}: java.lang.NullPointerException 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at android.app.ActivityThread.handleServiceArgs (ActivityThread.java:2507) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at android.app.ActivityThread.access $ 1900 (ActivityThread.java:130) 06 -12 22: 43: 22.268: E/AndroidRuntime (8146): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1292) 06-12 22: 43: 22.268: E/AndroidRuntime (8146) : at android.os.Handler.dispatchMessage (Handler.java:99) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at android.os.Looper.loop (Looper.java:137) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at android.app.ActivityThread.main (ActivityThread.java:4745) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at java.lang.reflect.Method.invokeNative (родной метод) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at java.lang.reflect.Method.invoke (Метод. java: 511) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) 06-12 22:43 : 22.268: E/AndroidRuntime (8146): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at dalvik .system.NativeStart.main (родной метод) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): вызвано: java.lang.NullPointerException 06-12 22: 43: 22.268: E/AndroidRuntime (8146)): по com.vektor.amapper.windows.ui.ButtonSetupPanel. (ButtonSetupPanel.java:18) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at com.vektor.amapper.windows.MainWindow.createAndAttachView (MainWindow.java:86) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at wei.mark.standout.ui.Window. (Window.java:150) 06-12 22:43 : 22.268: E/AndroidRuntime (8146): at wei.mark.standout.StandOutWindow.show (StandOutWindow.java:1079) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at wei.mark .standout.StandOutWindow.onStartCommand (StandOutWindow.java:382) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at com.vektor.amapper.windows.MainWindow.onStartCommand (MainWindow.java:150) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): at android.app.ActivityThread.handleServiceArgs (ActivityThread.java:2490) 06-12 22: 43: 22.268: E/AndroidRuntime (8146): ...10 более

Update: Я обнаружил, что проблема заключается в том, что, поскольку это LinearLayout находится в другом файле XML мне нужно надуть другой файл макета и показать определенный вид (The LinearLayout). Как действовать?

Update2: Я использовал этот код, чтобы получить нужный вид

public ButtonSetupPanel(String btnName, int keyCode, View v){ 
    AbsoluteLayout abs = (AbsoluteLayout) v.findViewById(R.id.mainbg); 
    LinearLayout view = (LinearLayout) LayoutInflater.from(v.getContext()).inflate(R.layout.btnsetup , null); 
    LinearLayout panel = (LinearLayout) view.findViewById(R.id.btnSetupPanel); 
    view.removeView(panel); 
    panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    panel.setX(512f); 
    panel.setY(300f); 
    panel.setOnTouchListener(this); 
    abs.addView(panel); 
} 
+3

AbsoluteLayout осуждался в уровне API 3 – Blackbelt

+0

мне нужно использовать его. – Vektor88

+0

Что говорит Logcat? –

ответ

2

Вы знаете, что AbsoluteLayout является устаревшим, поскольку уровень API 3? Попробуйте использовать RelativeLayout.

Вы можете восстановить абсолютное позиционирование, добавив свои дочерние представления в RelativeLayout и установить RelativeLayout.LayoutParams, чтобы иметь только значения по умолчанию, кроме width, height, marginTop и marginLeft. Верхний и левый поля будут похожи на верхний и левый в AbsoluteLayout. Также поддерживаются отрицательные поля.

Источник: Alternative to AbsoluteLayout

+0

Я боюсь, что, несмотря на макет, который я использую, в моем коде есть некоторая ошибка. – Vektor88

+1

мой совет вам - используйте RelativeLayout - он может делать те же вещи, что и Абсолют и даже лучше. ButtonSetupPanel.java:18 - какой код в 18 строке? – AndrewS

+0

комплектLayoutParams линия. Я боюсь, что ошибка состоит в том, что представление панели находится в другом XML-файле, и это вызывает исключение nullpointer – Vektor88