-1

我是 Android 编程新手,但对 Java 有一些经验,尽管还很缺乏经验。

我将首先发布 XML 文档,以便更容易描述。

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout 
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_weight="2"
        android:background="#4E2FEB">
    </LinearLayout>


    <HorizontalScrollView 
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:background="#E01F39" >

        <LinearLayout android:id="@+id/card_tray"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:orientation="horizontal" >

        </LinearLayout>
    </HorizontalScrollView>
 </LinearLayout>

我想在 java 代码中将 ImageView 添加到 Horizo​​ntalScrollView 中。这是我到目前为止得到的代码。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);

        LinearLayout l = (LinearLayout)findViewById(R.id.card_tray);

        l.addView((ImageView)findViewById(R.id.xo_1));
        l.addView((ImageView)findViewById(R.id.xo_2));
}

这是我拥有的另一个 .xml 文件,其中包含我要引用的 ImageView 视图。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView  android:id="@+id/xo_1"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:adjustViewBounds="true"
                android:paddingRight="10dp" 
                android:src="@drawable/xo_1" /> 

    <ImageView  android:id="@+id/xo_2"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:adjustViewBounds="true"
                android:paddingRight="10dp" 
                android:src="@drawable/xo_2" />  

</LinearLayout>

当我尝试使用 Eclipse 在我的平板电脑上运行它时,它会因通常的“应用程序没有响应”消息而崩溃。

编辑: 这是 LogCat 输出。

03-30 01:38:13.053: D/AndroidRuntime(29659): 关闭 VM 03-30 01:38:13.053: W/dalvikvm(29659): threadid=1: 线程退出未捕获异常 (group=0x41f0b2a0) 03 -30 01:38:13.053:E/AndroidRuntime(29659):致命异常:主要 03-30 01:38:13.053:E/AndroidRuntime(29659):java.lang.RuntimeException:无法启动活动 ComponentInfo{kpapps.testapp /kpapps.testapp.MainActivity}:java.lang.NullPointerException 03-30 01:38:13.053:E/AndroidRuntime(29659):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-30 01:38 :13.053: E/AndroidRuntime(29659): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.app.ActivityThread.access$700 (ActivityThread.java:140) 03-30 01:38:13.053: E/AndroidRuntime(29659):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03- 30 01:38:13.053: E/AndroidRuntime(29659): 在 android.os.Looper.loop(Looper.java:137) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.app。 ActivityThread.main(ActivityThread.java:4921) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-30 01:38:13.053: E /AndroidRuntime(29659): at java.lang.reflect.Method.invoke(Method.java:511) 03-30 01:38:13.053: E/AndroidRuntime(29659): at com.android.internal.os.ZygoteInit$ MethodAndArgsCaller.run(ZygoteInit.java:1038) 03-30 01:38:13.053: E/AndroidRuntime(29659): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 03-30 01:38:13.053:E/AndroidRuntime(29659):在 dalvik.system.NativeStart.main(本机方法)03-30 01:38:13.053:E/AndroidRuntime(29659):引起:java.lang.NullPointerException 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.view.ViewGroup.addView(ViewGroup.java:3481) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.view.ViewGroup .addView(ViewGroup.java:3464) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 kpapps.testapp.MainActivity.onCreate(MainActivity.java:22) 03-30 01:38:13.053: E /AndroidRuntime(29659): 在 android.app.Activity.performCreate(Activity.java:5188) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1094) 03-30 01:38:13.053: E/AndroidRuntime(29659): 在 android.app.ActivityThread。performLaunchActivity(ActivityThread.java:2074) 03-30 01:38:13.053: E/AndroidRuntime(29659): ... 11 更多

编辑:根据要求。MainActivity.java 的第 22 行

l.addView((ImageView)findViewById(R.id.xo_1));

编辑:

修订

我将java代码更改为;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);

        LinearLayout l = (LinearLayout)findViewById(R.id.card_tray);

        View cards = getLayoutInflater().inflate(R.layout.skill_cards, null);

        ImageView imageView = (ImageView)cards.findViewById(R.id.xo_1);
        ImageView imageView2 = (ImageView)cards.findViewById(R.id.xo_2);

        l.addView(imageView);
        l.addView(imageView2);
}

但它仍然会崩溃,只是出现不同的错误。这是新的 LogCat;

03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 致命异常: main 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): java.lang.RuntimeException: 无法启动活动 ComponentInfo{kpapps. testapp/kpapps.testapp.MainActivity}:java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android. app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android.app.ActivityThread.access$700(ActivityThread.java:140) 03-30 02:10 :31.833:​​ E/AndroidRuntime(4978): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java: main(Native Method) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): Caused by: java.lang.IllegalStateException: 指定的子节点已经有父节点。您必须首先在孩子的父母上调用 removeView()。03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android.view.ViewGroup.addViewInner(ViewGroup.java:3672) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android. view.ViewGroup.addView(ViewGroup.java:3543) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android.view.ViewGroup.addView(ViewGroup.java:3488) 03-30 02:10: 31.833:​​ E/AndroidRuntime(4978): 在 android.view.ViewGroup.addView(ViewGroup.java:3464) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 kpapps.testapp.MainActivity.onCreate(MainActivity .java:24) 03-30 02:10:31.833:​​ E/AndroidRuntime(4978): 在 android.app.Activity.performCreate(Activity.

4

2 回答 2

1

findViewById()只会在setContentView().
图像视图xo_1xo_2处于不同的布局中,因此findViewById(R.id.xo_1)将始终为空。

你必须先膨胀你的第二个布局:

View secondLayout = getLayoutInflater().inflate(R.id.second_layout, null, false);
ImageView imageView = (ImageView) secondLayout.findViewById(R.id.xo_1));
ImageView imageView2 = (ImageView) secondLayout.findViewById(R.id.xo_2));
l.addView(imageView);
l.addView(imageView2);

如果您正在寻找添加ImageViews 的动态方式,则无需在 xml 布局中定义它们。

You can add them programmatically:

ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.xo_1);
// etc...
l.addView(imageView, layoutParams);
于 2013-03-30T01:45:58.383 回答
0

在我们看到 logcat 之前,这不是一个确切的答案,但您可以尝试类似

 LinearLayout l = (LinearLayout)findViewById(R.id.card_tray);  
 ImageView imageView = (ImageView)findViewById(R.id.xo_1));
 ImageView imageView2 = (ImageView)findViewById(R.id.xo_2));
 l.addView(imageView);
 l.addView(imageView2);

这应该将这两个ImageViews 添加到LinearLayout您声明的中。我希望这有帮助。如果没有,请按照我的描述复制并粘贴 logcat 错误。

笔记

您只能使用Layout已膨胀的,但我看到您正在使用两个不同的Layouts. 您可能正在尝试访问一个View不在layout您这里膨胀的setContentView(R.layout.activity_main);

于 2013-03-30T01:39:07.067 回答