user5083158
user5083158

Reputation:

findViewById in fragment in android

I’m trying to initialize ViewPager in Fragment (ViewPager pager = fragmentNews.getPager()), but it’s still null:

My fragment:

import android.os.Bundle;

import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class NewsFragment extends Fragment {

    private ViewPager pager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_news, container, false);
        pager = (ViewPager) view.findViewById(R.id.sliding_pager);
        return view;
    }



    public ViewPager setAdapterForPager(PagerAdapter adapter){
        pager.setAdapter(adapter);
        return pager;
    }

    public ViewPager getPager() {
        return pager;
    }
}

Here is my MainActivity:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
...
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(R.id.container_for_fragments, fragmentNews).commit();
pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());


ViewPager pager = fragmentNews.getPager();

pager.setAdapter(pagerAdapter);
...

fragment_news.xml:

<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"
    android:weightSum="100"
    tools:context=".fragments.NewsFragment">


    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/sliding_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="30" />

...

</LinearLayout>

But in NewsFragment.java pager remains null. So after launching I have got RuntimeException, mistake in row:

pager.setAdapter(pagerAdapter); in MainActivity.java

Without trying to initialize the ViewPager, the app works fine.

Upvotes: 0

Views: 655

Answers (2)

Ivo
Ivo

Reputation: 23144

Most likely, the onCreateView of the fragment hasn't been executed yet. It takes time adding a Fragment to your Activity. You can't assume it happened right after adding it.

What you can do is overwrite onViewCreated in the Fragment that notifies the Activity in some way that it is created.

Also, where is fragmentNews coming from? you do a new NewsFragment() in the transaction but it's not saved to fragmentNews so you have two seperate Fragments it seems.

EDIT:

You could do it like this I think
Add this your Fragment:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState); 
    ((MainActivity) getActivity()).viewIsCreated();
}

And this in your activity

public void viewIsCreated() {
    ViewPager pager = fragmentNews.getPager();
    pager.setAdapter(pagerAdapter);
}

And remove those two lines from the onCreate

Upvotes: 0

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132972

Here

pager.setAdapter(pagerAdapter);

line causing issue because pager is null.

Why?

Because using two different objects of NewsFragment : one for calling getPager method another which is passing in add method as last parameter.

Use same object which is passed in add method of accessing View's,methods,... from NewsFragment Fragment.

Upvotes: 1

Related Questions