我正在尝试添加一个代表包含一些元素的小面板的LinearLayout
到AbsoluteLayout
的主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);
}
答案 0 :(得分:2)
您知道AbsoluteLayout自API级别3以来已被弃用吗? 尝试使用RelativeLayout。
您可以通过将子视图添加到RelativeLayout来重新创建绝对定位,并将RelativeLayout.LayoutParams设置为仅具有除width,height,marginTop和marginLeft之外的默认值。 AbsoluteLayout中的上边距和左边距类似于顶部和左边。此外,支持负边距。