android 片段中的 findViewById

findViewById in fragment in android

我正在尝试在 Fragment 中初始化 ViewPager (ViewPager pager = fragmentNews.getPager()),但它仍然为 null:

我的片段:

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

这是我的 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>

但在 NewsFragment.java 中,寻呼机仍然为空。所以在启动后我得到了 RuntimeException,行中的错误:

pager.setAdapter(pagerAdapter);在 MainActivity.java

无需尝试初始化 ViewPager,该应用程序运行正常。

这里

pager.setAdapter(pagerAdapter);

行导致问题,因为 pagernull

为什么?

因为使用 NewsFragment 的两个 不同对象:一个用于调用 getPager 方法,另一个将 add 方法作为最后一个参数传递.

使用在 add 方法中传递的同一对象从 NewsFragment 片段访问视图的方法...。

很可能,片段的 onCreateView 尚未执行。向您的 Activity 添加片段需要时间。您不能假设它是在添加后立即发生的。

您可以做的是覆盖 Fragment 中的 onViewCreated,以某种方式通知 Activity 它已创建。

此外,fragmentNews 是从哪里来的?你在交易中做了一个 new NewsFragment() 但它没有保存到 fragmentNews 所以你看起来有两个单独的片段。

编辑:

我想你可以这样做
添加您的片段:

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

这在你的 activity

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

并从 onCreate

中删除这两行