-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));
}

これは、私が参照しようとしている ImageView ビューを含む、私が持っている他の .xml ファイルです。

<?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(ネイティブ メソッド) 03-30 01:38:13.053: E /AndroidRuntime(29659): java.lang.reflect.Method.invoke(Method.java:511) 03-30 01:38:13.053: E/AndroidRuntime(29659): com.android.internal.os.ZygoteInit$ でMethodAndArgsCaller.run(ZygoteInit.java:1038) 03-30 01:38:13.053: E/AndroidRuntime(29659): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 03-30 01:38:13.053: E/AndroidRuntime(29659): 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): 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): 致命的な例外: メイン 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): 原因: 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()
imageviewsxo_1xo_2は異なるレイアウトにあるため、findViewById(R.id.xo_1)常に null になります。

最初に 2 番目のレイアウトをインフレートする必要があります。

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);
于 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);

これにより、宣言した にこれら 2 つImageViewの sが追加されます。LinearLayoutこれが役立つことを願っています。そうでない場合は、説明した logcat エラーをコピーして貼り付けてください。

ノート

Layout膨張した でのみ作業できますが、2 つの異なる で作業しているようですLayouts。ここで膨らませたViewにない にアクセスしようとしている可能性がありますlayoutsetContentView(R.layout.activity_main);

于 2013-03-30T01:39:07.067 に答える