我正在尝试在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,该应用程序运行正常。
答案 0 :(得分:1)
下面
pager.setAdapter(pagerAdapter);
由于pager
为null
,行导致问题。
<强>为什么吗
因为使用两个 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