在 Fragment 中调用 ViewPager
Calling ViewPager inside a Fragment
我正在 ViewPager 的帮助下设计一个引导屏幕。 ViewPager 位于我的 MainActivity class 下的片段内。当我将 ViewPager 适配器 class 传递到片段中的 ViewPager 时,会出现错误!它抛出 NullPointerException 并且在断点调试后我发现我的 PagerAdapter class 内的 inflater 是空的。
我已经尝试了一些替代方法来让充气机工作,但没有成功!我将 post 我的代码如下:
ViewPager 片段 class:
public class ViewPagerFragment extends Fragment {
ViewPager viewpager;
LinearLayout dotsLayout;
SliderAdapter sliderAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_pager, container, false);
viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);
dotsLayout = (LinearLayout) view.findViewById(R.id.dotsLayout);
sliderAdapter = new SliderAdapter(view.getContext());
viewpager.setAdapter(sliderAdapter); //The error is thrown here
// Inflate the layout for this fragment
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//Toast.makeText(view.getContext(),"Here",Toast.LENGTH_LONG).show();
}}
ViewPager 适配器Class:
public class SliderAdapter extends PagerAdapter {
Context context1;
LayoutInflater inflater;
public int[] slide_images = {
R.drawable.band,
R.drawable.studio,
R.drawable.videoshoot
};
public String[] slide_headings = {
"REHEARSAL PAD", "RECORDING STUDIO", "SESSION VIDEOSHOOT"
};
public String[] slide_desc ={
String.valueOf(R.string.rehearsal_desc),
String.valueOf(R.string.studio_desc),
String.valueOf(R.string.videoshoot_desc)
};
public SliderAdapter(Context context){
context1 = context;
}
@Override
public int getCount() {
return slide_headings.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view== (ConstraintLayout)object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//ViewPager Sliding Images and Desc
inflater = (LayoutInflater)context1.getSystemService(context1.LAYOUT_INFLATER_SERVICE);
//inflater = LayoutInflater.from(context1);
View view = inflater.inflate(R.layout.slider_layout,container,false);
ImageView slideImageView = (ImageView) view.findViewById(R.id.SliderImageView);
TextView slideHeading = (TextView) view.findViewById(R.id.SliderTextView1);
TextView slideDesc = (TextView) view.findViewById(R.id.SliderTextView2);
slideImageView.setImageResource(slide_images[position]);
slideHeading.setText(slide_headings[position]);
slideDesc.setText(slide_desc[position]);
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((ConstraintLayout)object);
}}
异常日志如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.soundflixstudios, PID: 13363
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.viewpager.widget.ViewPager.setAdapter(androidx.viewpager.widget.PagerAdapter)' on a null object reference
at com.example.soundflixstudios.onboarding.ViewPagerFragment.onCreateView(ViewPagerFragment.java:43)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7099)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:536)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
感谢任何帮助,是的,我在 Whosebug 中经历了多次 post,但没有找到任何解决方案,因此提出了一个新问题!
提前致谢!
编辑:我为“view_pager_fragment”布局添加了 xml
enter code here<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
tools:context=".onboarding.ViewPagerFragment">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/sliderViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1">
</androidx.viewpager2.widget.ViewPager2>
<LinearLayout
android:id="@+id/dotsLayout"
android:layout_width="wrap_content"
android:layout_height="66dp"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="horizontal">
</LinearLayout>
能否添加 xml 文件 (viewPagerFragment)。在正常情况下,当您缺少对 xml 的引用或缺少创建 xml 标记(不同屏幕- landscape/portrait)
时,将显示 nullPointerException
根本原因
在view_pager_fragment.xml
文件中,你声明了一个ID为sliderViewPager
的ViewPager2
,但在ViewPagerFragment
class中,你使用了一个ViewPager
变量并为其分配一个 ID 为 viewPagerFragment
的视图。
解决方案
步骤 1. 将 fragment_view_pager.xml
更改为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/sliderViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1">
</androidx.viewpager.widget.ViewPager>
<LinearLayout
android:id="@+id/dotsLayout"
android:layout_width="wrap_content"
android:layout_height="66dp"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
步骤 2. 在 ViewPagerFragment
class 中,将您的代码从
viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);
至
viewpager = (ViewPager) view.findViewById(R.id.sliderViewPager);
我正在 ViewPager 的帮助下设计一个引导屏幕。 ViewPager 位于我的 MainActivity class 下的片段内。当我将 ViewPager 适配器 class 传递到片段中的 ViewPager 时,会出现错误!它抛出 NullPointerException 并且在断点调试后我发现我的 PagerAdapter class 内的 inflater 是空的。 我已经尝试了一些替代方法来让充气机工作,但没有成功!我将 post 我的代码如下:
ViewPager 片段 class:
public class ViewPagerFragment extends Fragment {
ViewPager viewpager;
LinearLayout dotsLayout;
SliderAdapter sliderAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_pager, container, false);
viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);
dotsLayout = (LinearLayout) view.findViewById(R.id.dotsLayout);
sliderAdapter = new SliderAdapter(view.getContext());
viewpager.setAdapter(sliderAdapter); //The error is thrown here
// Inflate the layout for this fragment
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//Toast.makeText(view.getContext(),"Here",Toast.LENGTH_LONG).show();
}}
ViewPager 适配器Class:
public class SliderAdapter extends PagerAdapter {
Context context1;
LayoutInflater inflater;
public int[] slide_images = {
R.drawable.band,
R.drawable.studio,
R.drawable.videoshoot
};
public String[] slide_headings = {
"REHEARSAL PAD", "RECORDING STUDIO", "SESSION VIDEOSHOOT"
};
public String[] slide_desc ={
String.valueOf(R.string.rehearsal_desc),
String.valueOf(R.string.studio_desc),
String.valueOf(R.string.videoshoot_desc)
};
public SliderAdapter(Context context){
context1 = context;
}
@Override
public int getCount() {
return slide_headings.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view== (ConstraintLayout)object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//ViewPager Sliding Images and Desc
inflater = (LayoutInflater)context1.getSystemService(context1.LAYOUT_INFLATER_SERVICE);
//inflater = LayoutInflater.from(context1);
View view = inflater.inflate(R.layout.slider_layout,container,false);
ImageView slideImageView = (ImageView) view.findViewById(R.id.SliderImageView);
TextView slideHeading = (TextView) view.findViewById(R.id.SliderTextView1);
TextView slideDesc = (TextView) view.findViewById(R.id.SliderTextView2);
slideImageView.setImageResource(slide_images[position]);
slideHeading.setText(slide_headings[position]);
slideDesc.setText(slide_desc[position]);
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((ConstraintLayout)object);
}}
异常日志如下:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.soundflixstudios, PID: 13363 java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.viewpager.widget.ViewPager.setAdapter(androidx.viewpager.widget.PagerAdapter)' on a null object reference at com.example.soundflixstudios.onboarding.ViewPagerFragment.onCreateView(ViewPagerFragment.java:43) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) at androidx.fragment.app.FragmentManager.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:7099) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:536) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
感谢任何帮助,是的,我在 Whosebug 中经历了多次 post,但没有找到任何解决方案,因此提出了一个新问题! 提前致谢!
编辑:我为“view_pager_fragment”布局添加了 xml
enter code here<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
tools:context=".onboarding.ViewPagerFragment">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/sliderViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1">
</androidx.viewpager2.widget.ViewPager2>
<LinearLayout
android:id="@+id/dotsLayout"
android:layout_width="wrap_content"
android:layout_height="66dp"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="horizontal">
</LinearLayout>
能否添加 xml 文件 (viewPagerFragment)。在正常情况下,当您缺少对 xml 的引用或缺少创建 xml 标记(不同屏幕- landscape/portrait)
时,将显示 nullPointerException根本原因
在view_pager_fragment.xml
文件中,你声明了一个ID为sliderViewPager
的ViewPager2
,但在ViewPagerFragment
class中,你使用了一个ViewPager
变量并为其分配一个 ID 为 viewPagerFragment
的视图。
解决方案
步骤 1. 将 fragment_view_pager.xml
更改为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/sliderViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1">
</androidx.viewpager.widget.ViewPager>
<LinearLayout
android:id="@+id/dotsLayout"
android:layout_width="wrap_content"
android:layout_height="66dp"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
步骤 2. 在 ViewPagerFragment
class 中,将您的代码从
viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);
至
viewpager = (ViewPager) view.findViewById(R.id.sliderViewPager);