2013-06-12 186 views
0

我想添加一个LinearLayout,代表一个包含一些元素的小面板到我的Activity的主要AbsoluteLayout。 我正在使用此代码,但应用程序崩溃,这是面板类的构造函数,应该将视图添加到主布局。类似的代码可以添加运行时创建的按钮,但不适用于此。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的:(我用突出库)

06-12 22:43:22.268:E/AndroidRuntime(8146):致命异常:主 06-12 22时43分: 22.268:E/AndroidRuntime(8146): java.lang.RuntimeException:无法启动服务 [email protected] 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):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)06-12 22:43:22.268:E/AndroidRuntime(8146):在 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 ):在(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更

更新:我发现的问题是,由于这是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); 
} 
+3

AbsoluteLayout被弃用API级别3 – Blackbelt

+0

我需要使用它。 – Vektor88

+0

什么告诉Logcat? –

回答

2

你知道AbsoluteLayout是因为API级别3弃用? 尝试使用RelativeLayout。

您可以通过将您的子视图添加到RelativeLayout来重新创建绝对定位,并将RelativeLayout.LayoutParams设置为除宽度,高度,marginTop和marginLeft以外仅具有默认值。顶部和左边距与AbsoluteLayout中的顶部和左侧相似。此外,支持负利差。

来源: Alternative to AbsoluteLayout

+0

我担心,尽管我使用的布局有我的代码中的一些错误。 – Vektor88

+1

我给你的建议 - 使用RelativeLayout - 它可以做和Absolute一样的东西,甚至更好。 ButtonSetupPanel.java:18 - 18行中的代码是什么? – AndrewS

+0

setLayoutParams行。恐怕错误是面板视图在不同的xml文件中,这会导致nullpointerexception – Vektor88