【发布时间】:2021-08-04 18:30:23
【问题描述】:
我尝试在我的片段中使用选项卡布局,它需要将上下文从我的片段传递给适配器,我尝试使用 getactivity() 、 rootView.getcontext() 、 getActivity().getApplicationContext() 替换 @987654325 @源自
final MyAdapter adapter = new MyAdapter(this,getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
但仍然收到错误空对象引用:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.viewpager.widget.ViewPager.setAdapter(androidx.viewpager.widget.PagerAdapter)”
在 com.example.pesanpalgading20.MenuFragment.onCreateView(MenuFragment.java:81)
这是我的
Menu Fragment :
package com.example.pesanpalgading20;
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.material.tabs.TabLayout;
/**
* A simple {@link Fragment} subclass.
* Use the {@link MenuFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class MenuFragment extends Fragment {
TabLayout tabLayout;
ViewPager viewPager;
Context context;
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public MenuFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment MenuFragment.
*/
// TODO: Rename and change types and number of parameters
public static MenuFragment newInstance(String param1, String param2) {
MenuFragment fragment = new MenuFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View viewRoot = inflater.inflate(R.layout.fragment_menu, container, false);
tabLayout = (TabLayout)viewRoot.findViewById(R.id.tabLayoutView);
viewPager = (ViewPager)viewRoot.findViewById(R.id.containerViewPager);
context = container.getContext();
tabLayout.addTab(tabLayout.newTab().setText("Makanan"));
tabLayout.addTab(tabLayout.newTab().setText("Minuman"));
tabLayout.addTab(tabLayout.newTab().setText("Jajanan"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
final MyAdapter adapter = new MyAdapter(getActivity().getApplicationContext(),getFragmentManager(),tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
// Inflate the layout for this fragment
return viewRoot;
}
}
这是MyAdapter :
package com.example.pesanpalgading20;
import android.content.Context;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import com.example.pesanpalgading20.ViewMenuHome.JajananMenuFragment;
import com.example.pesanpalgading20.ViewMenuHome.MakananMenuFragment;
import com.example.pesanpalgading20.ViewMenuHome.MinumanMenuFragment;
public class MyAdapter extends FragmentPagerAdapter {
private Context myContext;
int totalTabs;
public MyAdapter (Context context, FragmentManager fm, int totalTabs){
super(fm);
myContext = context;
this.totalTabs = totalTabs;
}
//fragment per tabs
@Override
public Fragment getItem(int position){
switch(position){
case 0:
MakananMenuFragment makananMenuFragment = new MakananMenuFragment();
return makananMenuFragment;
case 1:
MinumanMenuFragment minumanMenuFragment = new MinumanMenuFragment();
return minumanMenuFragment;
case 2:
JajananMenuFragment jajananMenuFragment = new JajananMenuFragment();
return jajananMenuFragment;
default: return null;
}
}
//counts total number of tabs
@Override
public int getCount() {
return totalTabs;
}
}
这里是fragment_menu.xml :
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MenuFragment">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayoutView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.viewpager.widget.ViewPager
android:layout_width="355dp"
android:layout_height="455dp"
app:layout_constraintTop_toBottomOf="@id/tabLayoutView"
tools:layout_editor_absoluteX="8dp"/>
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="@color/black"
android:textSize="20sp"
android:gravity="center"
android:text="Menu" />
</FrameLayout>
如何替换 this 以正确使用从我的片段到 myAdapter 的上下文?
谢谢
【问题讨论】:
-
您能否发布您的
MenuFragment布局文件?使用fragment_menu文件更新问题 -
啊,是的,在主帖中完成编辑
标签: java android android-studio android-fragments