Android ViewPager для ссылки на пустой объект - PullRequest
0 голосов
/ 24 июня 2019

У меня есть действие, для которого требуется viewPager с двумя фрагментами, но когда я настраиваю адаптер ViewPager в onCreateView, он всегда равен нулю. Я использую ButterKnife для привязки своего макета к активности.

Ошибка была при выполнении этого кода

viewPager.setAdapter(vp_adapter);

Ошибка в Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference

MainActivity.java

@BindView(R.id.tab_layout)
TabLayout tabLayout;

@BindView(R.id.view_pager)
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    handleViewPager();
    handlePosition();
}


private void handleViewPager(){
    ViewPagerAdapter vp_adapter = new ViewPagerAdapter(getSupportFragmentManager(), getApplicationContext());
    viewPager.setAdapter(vp_adapter);
    viewPager.setOffscreenPageLimit(2);
    tabLayout.setupWithViewPager(viewPager);
}

activity_main.xml

<LinearLayout
    android:id="@+id/topUpHeader"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:background="#1e84d4">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Top Up"
        android:textColor="#ffffff"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"/>


</LinearLayout>

<LinearLayout
    android:id="@+id/viewpager_parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_below="@id/topUpHeader">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabGravity="fill"
        app:tabMode="fixed"
        app:tabIndicatorColor="#000000">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/viewpager_parent">

    </android.support.v4.view.ViewPager>

</LinearLayout>

Как это можно сделать?

изм: так что просто запустите с onCreateView, как это

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

    viewPager   = findViewById(R.id.view_pager);
    tabLayout   = findViewById(R.id.tab_layout);
    ViewPagerAdapter vp_adapter = new ViewPagerAdapter(getSupportFragmentManager(), this);
    viewPager.setAdapter(vp_adapter);
    viewPager.setOffscreenPageLimit(2);
    tabLayout.setupWithViewPager(viewPager);

    handlePosition();
}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы забыли найти вид.Я вижу, что вы используете привязку представления ButterKnife.

Итак, сначала объявите глобальную переменную viewPager, используя следующий код.

@BindView(R.id. view_pager) 
ViewPager viewPager;

SDK Butterknife в gradle.

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
0 голосов
/ 24 июня 2019

Вы используете неверный путь Butterknife.Вам нужно определить каждое представление в вашем XML, которое вы хотите использовать в своем Java-файле.Определите viewPager как @BindView(R.id.view_pager) ViewPager viewPager;.То же самое касается tabLayout.Рассмотрите возможность использования привязки данных, если вы хотите использовать viewPager напрямую.

...