find中的findViewById片段在android中

时间:2015-11-27 14:39:11

标签: android android-fragments android-viewpager

我正在尝试在Fragment(ViewPager pager = fragmentNews.getPager())中初始化ViewPager,但它仍为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,该应用程序运行正常。

2 个答案:

答案 0 :(得分:1)

下面

pager.setAdapter(pagerAdapter);
由于pagernull

行导致问题。

<强>为什么吗

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

使用从add片段访问View的方法的NewsFragment方法传递的同一个对象。

答案 1 :(得分:0)

最有可能的是,片段的onCreateView尚未执行。将片段添加到您的活动需要时间。你不能在添加它之后立即认为它发生了。

您可以做的是在片段中覆盖onViewCreated,以某种方式通知活动创建它。

此外,fragmentNews来自哪里?您在交易中执行了new NewsFragment(),但它未保存到fragmentNews,因此您似乎有两个单独的碎片。

编辑:

我认为你可以这样做 添加你的碎片:

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

这在您的活动中

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

onCreate

中删除这两行