Android:如何将布局添加到AbsoluteLayout中

时间:2013-06-12 14:47:58

标签: android android-layout android-ui

我正在尝试添加一个代表包含一些元素的小面板的LinearLayoutAbsoluteLayout的主Activity。 我正在使用此代码,但应用程序崩溃,这是面板类的构造函数,应该将视图添加到主布局。类似的代码用于添加运行时创建的按钮,但不适用于此。

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:E / AndroidRuntime(8146):致命异常:主要   06-12 22:43:22.268:E / AndroidRuntime(8146):   java.lang.RuntimeException:无法启动服务   com.vektor.amapper.windows.MainWindow@413e44b0 with Intent {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(Native Method)06-12   22:43:22.268:E / AndroidRuntime(8146):at   java.lang.reflect.Method.invoke(Method.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(Native Method)06-12 22:43:22.268:   E / AndroidRuntime(8146):引起:java.lang.NullPointerException   06-12 22:43:22.268:E / AndroidRuntime(8146):at   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 more

更新:我发现问题在于,由于此LinearLayout位于另一个XML文件中,我需要对其他布局文件进行充气并显示已定义的视图(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);
}

1 个答案:

答案 0 :(得分:2)

您知道AbsoluteLayout自API级别3以来已被弃用吗? 尝试使用RelativeLayout。

您可以通过将子视图添加到RelativeLayout来重新创建绝对定位,并将RelativeLayout.LayoutParams设置为仅具有除width,height,marginTop和marginLeft之外的默认值。 AbsoluteLayout中的上边距和左边距类似于顶部和左边。此外,支持负边距。

来源: Alternative to AbsoluteLayout

相关问题