将资源中的ImageView添加到javacode中的LinearLayout

时间:2013-03-30 01:24:31

标签: java android imageview

我是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在我的平板电脑上运行它时,它会崩溃,通常的应用程序没有响应&#39;消息。

修改 这是LogCat输出。

  

03-30 01:38:13.053:D / AndroidRuntime(29659):关闭VM 03-30   01:38:13.053:W / dalvikvm(29659):threadid = 1:线程退出   未捕获的异常(组= 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):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)   03-30 01:38:13.053:E / AndroidRuntime(29659):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)   03-30 01:38:13.053:E / AndroidRuntime(29659):at   android.app.ActivityThread.access $ 700(ActivityThread.java:140)03-30   01:38:13.053:E / AndroidRuntime(29659):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1237)   03-30 01:38:13.053:E / AndroidRuntime(29659):at   android.os.Handler.dispatchMessage(Handler.java:99)03-30   01:38:13.053:E / AndroidRuntime(29659):at   android.os.Looper.loop(Looper.java:137)03-30 01:38:13.053:   E / AndroidRuntime(29659):at   android.app.ActivityThread.main(ActivityThread.java:4921)03-30   01:38:13.053:E / AndroidRuntime(29659):at   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):at   dalvik.system.NativeStart.main(Native Method)03-30 01:38:13.053:   E / AndroidRuntime(29659):引起:java.lang.NullPointerException   03-30 01:38:13.053:E / AndroidRuntime(29659):at   android.view.ViewGroup.addView(ViewGroup.java:3481)03-30   01:38:13.053:E / AndroidRuntime(29659):at   android.view.ViewGroup.addView(ViewGroup.java:3464)03-30   01:38:13.053:E / AndroidRuntime(29659):at   kpapps.testapp.MainActivity.onCreate(MainActivity.java:22)03-30   01:38:13.053:E / AndroidRuntime(29659):at   android.app.Activity.performCreate(Activity.java:5188)03-30   01:38:13.053:E / AndroidRuntime(29659):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)   03-30 01:38:13.053:E / AndroidRuntime(29659):at   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:3​​1.833:E / AndroidRuntime(4978):致命异常:主要   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):   java.lang.RuntimeException:无法启动活动   ComponentInfo {kpapps.testapp / kpapps.testapp.MainActivity}:   java.lang.IllegalStateException:指定的子节点已经有了   家长。您必须首先在孩子的父母上调用removeView()。 03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.ActivityThread.access $ 700(ActivityThread.java:140)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1237)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):at   android.os.Handler.dispatchMessage(Handler.java:99)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.os.Looper.loop(Looper.java:137)03-30 02:10:3​​1.833:   E / AndroidRuntime(4978):at   android.app.ActivityThread.main(ActivityThread.java:4921)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   java.lang.reflect.Method.invokeNative(Native Method)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   java.lang.reflect.Method.invoke(Method.java:511)03-30 02:10:3​​1.833:   E / AndroidRuntime(4978):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1038)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   dalvik.system.NativeStart.main(Native Method)03-30 02:10:3​​1.833:   E / AndroidRuntime(4978):引起:java.lang.IllegalStateException:   指定的子项已有父项。你必须调用removeView()   首先关注孩子的父母。 03-30 02:10:3​​1.833:   E / AndroidRuntime(4978):at   android.view.ViewGroup.addViewInner(ViewGroup.java:3672)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.view.ViewGroup.addView(ViewGroup.java:3543)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.view.ViewGroup.addView(ViewGroup.java:3488)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.view.ViewGroup.addView(ViewGroup.java:3464)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   kpapps.testapp.MainActivity.onCreate(MainActivity.java:24)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.Activity.performCreate(Activity.java:5188)03-30   02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)   03-30 02:10:3​​1.833:E / AndroidRuntime(4978):... 11 more

2 个答案:

答案 0 :(得分: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);

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

您可以通过编程方式添加它们:

ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.xo_1);
// etc...
l.addView(imageView, layoutParams);

答案 1 :(得分: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);

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

注意

您只能使用已被夸大的Layout,但我发现您正在使用两个不同的Layouts。您可能正在尝试访问View layout,而setContentView(R.layout.activity_main);此处{{1}}