58

このプログラムの何が問題なのかを調べるのを手伝ってくれる人はいますか? onCreate()メソッドでは、すべての ID に対して null が返され、findViewById()後で null ポインター例外が発生します。findViewById()ビューが見つからない理由がわかりません。助言がありますか?

これはメインコードです:

public class MainActivity extends Activity {

    ViewPager pager;
    MyPagerAdapter adapter;
    LinearLayout layout1, layout2, layout3;

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

        layout1 = (LinearLayout) findViewById(R.id.first_View);
        layout2 = (LinearLayout) findViewById(R.id.second_View);
        layout3 = (LinearLayout) findViewById(R.id.third_View);

        adapter = new MyPagerAdapter();
        pager = (ViewPager) findViewById(R.id.main_pager);
        pager.setAdapter(adapter);
    }

    private class MyPagerAdapter extends PagerAdapter
    {

        @Override
        public int getCount() { 
            return 3;
        }

        @Override
        public Object instantiateItem(ViewGroup collection, int position) {

            LinearLayout l = null;

            if (position == 0 )
            {
                l = layout1;
            }
            if (position == 1)
            {
                l = layout2;
            }

            if (position == 2)
            {
                l = layout3;
            }
                collection.addView(l, position);
                return l;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return (view==object);
        }

         @Override
         public void destroyItem(ViewGroup collection, int position, Object view) {
                 collection.removeView((View) view);
         }
    }
}

関連する XML ファイル:

activity_main レイアウト:

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


    <android.support.v4.view.ViewPager
                        android:layout_width="match_parent" 
                        android:layout_height="match_parent" 
                        android:id="@+id/main_pager"/>
</LinearLayout>

activity_first レイアウト:

<?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:id="@+id/first_View">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<Button
    android:id="@+id/button1"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

</LinearLayout>

activity_second レイアウト:

 <?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:id="@+id/second_View">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

</LinearLayout>

そして activity_second レイアウト:

<?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:id="@+id/third_View">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

</LinearLayout>
4

12 に答える 12

89

findViewById()で指定したレイアウトに存在する場合は View を返しsetContentView()、それ以外の場合は null を返します。それがあなたに起こっていることです。を使用せず、 on に対するsetContentView()有効なビューがない場合は、を呼び出すまで常に null を返すことに注意してください。findViewById()findViewById()setContentView()

onCreate()これは、トップレベルの変数が NPEをトリガーすることも意味しますsetContentView()アクティビティのライフサイクルも参照してください

たとえばsetContentView(R.layout.activity_first);、それを呼び出すfindViewById(R.id.first_View);と、レイアウトである View が返されます。

ただし、findViewById(R.id.second_View);前に を呼び出すと、レイアウトに と呼ばれるビューがないため、setContentView()返されます。nullactivity_first.xml@+id/second_View

于 2013-09-29T13:21:42.043 に答える
2

取得しようとしているビューは、activity_mainレイアウトで定義されていません。ページャーに追加しようとしているビューをプログラムで膨らませる必要があります.-

@Override
public Object instantiateItem(ViewGroup collection, int position) {
    LinearLayout l = null;

    if (position == 0) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_first, null);
    }
    if (position == 1) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_second, null);
    }
    if (position == 2) {
        l = (LinearLayout) View.inflate(this, R.layout.activity_third, null);
    }

    collection.addView(l, position);
    return l;
}
于 2013-09-29T13:25:35.187 に答える
1

それらのビューにアクセスする前に、これらのビューをページャー アダプターに追加します。

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

    adapter = new MyPagerAdapter();
    pager = (ViewPager) findViewById(R.id.main_pager);
    pager.setAdapter(adapter);

    layout1 = (LinearLayout) findViewById(R.id.first_View);
    layout2 = (LinearLayout) findViewById(R.id.second_View);
    layout3 = (LinearLayout) findViewById(R.id.third_View);

}

ページャー アダプターで:

public Object instantiateItem(View collection, int position) {
    if(position == 0){
        View layout = inflater.inflate(R.layout.activity_first, null);

        ((ViewPager) collection).addView(layout);

        return layout;
    } 
    ... and so forth.

}

ここから、findViewById を介してアクセスできます。

于 2013-09-29T13:28:33.143 に答える
1

私の場合、それは私の愚かな間違いでした。OnCreate メソッドでコードを記述しましたが、コード行のにありましたsetContentView。コードをこの行の下に移動すると、アプリケーションは正常に動作し始めました。

setContentView(R.layout.activity_main);
于 2018-05-08T16:37:37.670 に答える
1

アダプターを使用してレイアウトを膨張させ、位置に基づいてビューを検索できます。

override fun instantiateItem(collection: ViewGroup, position: Int) : ViewGroup {
    val inflater = LayoutInflater.from(mContext)
    val layout = inflater.inflate(mData[position], collection, false) as ViewGroup

    if(position == your_position) {
       val nameOfField: TextView = layout.findViewById(R.id.item_id)
    }
于 2021-11-12T17:30:05.127 に答える
0

上記の@Warlockの発言は正しいです。LinearLayoutのlayout1、layout2、layout3を正しい方法で初期化する必要があります。

LinearLayout layout1 = (LinearLayout) View.inflate(this, R.layout.first_View, null);
LinearLayout layout2 = (LinearLayout) View.inflate(this, R.layout.second_View, null);
LinearLayout layout3 = (LinearLayout) View.inflate(this, R.layout.third, null);

私のアドバイスがあなたを助けてくれることを願っています

于 2013-09-29T13:29:56.260 に答える
0

Android ではfindViewById(R.id.some_id)、レイアウト セットでビューを検索しているときに機能します。

つまり、レイアウトを設定している場合は、次のように言います。

setContentView(R.layout.my_layout);

ビューは、このレイアウト (my_layout) でのみ見つけることができます。

コードlayout1ではlayout2layout3すべてが 3 つの異なるレイアウトであり、アクティビティに設定されていません。

于 2013-09-29T13:34:49.447 に答える
0

今日このエラーが発生しましたが、簡単にクリアできたので、「フェイスパーム」しました。

res/layout-port ディレクトリのレイアウト xml ファイルに UI 要素を追加してみてください!!!

于 2014-05-26T09:51:44.127 に答える
0

このメソッドは、( で呼び出した)findViewByIdレイアウト内にあるものを見つける必要があります。setContentView

于 2013-09-29T13:59:20.060 に答える