【发布时间】:2016-06-04 07:11:12
【问题描述】:
我的目标是替换 viewpager 中的 Fragment。我得到了相同Replace one fragment with other的匹配解决方案
下面是我在上面链接中使用的几乎相同的代码
public interface SecondPageFragmentListener {
void onSwitchToNextFragment();
}
我已经在我的 ViewPager 适配器中实现了上面的接口。我只是粘贴了我的适配器的完整代码,以便大家理解它
public class TabPagerAdapter extends FragmentPagerAdapter{
private final Resources resources;
private Context mContext;
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
Fragment result = null;
FirstPageListener listener = new FirstPageListener();
public TabPagerAdapter(final Resources resources, FragmentManager fm,Context mContext) {
super(fm);
this.mContext = mContext;
this.resources = resources;
}
public void updateData(){
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
// First Fragment of First Tab
result = new Position();
break;
case 1:
// First Fragment of Second Tab
result = new Alerts();
break;
case 2:
// First Fragment of Third Tab
result = new Reports();
break;
default:
result = null;
break;
}
return result;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(final int position) {
switch (position) {
case 0:
return resources.getString(R.string.tab_position_title);
case 1:
return resources.getString(R.string.tab_alert_title);
case 2:
return resources.getString(R.string.tab_reports_title);
default:
return null;
}
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof Alerts &&
result instanceof CaptureIncident) {
return POSITION_NONE;
}
if (object instanceof CaptureIncident &&
result instanceof Alerts) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
private final class FirstPageListener implements
SecondPageFragmentListener {
public void onSwitchToNextFragment() {
((AppCompatActivity)mContext).getSupportFragmentManager().beginTransaction().remove(result)
.commit();
if (result instanceof Alerts){
result = CaptureIncident.newInstance("","",listener);
}else{ // Instance of NextFragment
result = Alerts.newInstance("","",listener);
}
notifyDataSetChanged();
}
}
}
我刚刚创建了一个 Inner 类并实现了链接中提到的 SecondPageFragmentListener 接口。
现在我已经在我的警报片段中初始化了界面
static SecondPageFragmentListener secondPageListener;
public static Alerts newInstance(String param1, String param2,SecondPageFragmentListener listener) {
Alerts fragment = new Alerts();
secondPageListener = listener;
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
现在我在按钮点击时调用接口方法
secondPageListener.onSwitchToNextFragment();
下面是我的片段代码
public class Alerts extends RootFragment{
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private RecyclerView gridview;
private GridAdapter gridAdapter;
private GridLayoutManager gridLayoutManager;
private OnFragmentInteractionListener mListener;
public static SecondPageFragmentListener secondPageListener;
public Alerts() {
// Required empty public constructor
}
@SuppressLint("ValidFragment")
public Alerts(SecondPageFragmentListener listener){
secondPageListener = listener;
}
public static Alerts newInstance(String param1, String param2,SecondPageFragmentListener listener) {
Alerts fragment = new Alerts();
secondPageListener = listener;
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) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_alerts, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initUiView();
RecyclerListener();
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
private void initUiView() {
gridview = (RecyclerView)getActivity().findViewById(R.id.gridview);
gridview.setHasFixedSize(true);
gridview.setLayoutManager(new GridLayoutManager(getActivity(), 3));
//list Population
List<ItemObject> rowListItem = getAllItemList();
gridAdapter = new GridAdapter(getActivity(),rowListItem);
gridview.setAdapter(gridAdapter);
gridAdapter.notifyDataSetChanged();
}
private List<ItemObject> getAllItemList(){
List<ItemObject> allItems = new ArrayList<ItemObject>();
allItems.add(new ItemObject("altercation","0,50 miles - 10 min ago", R.drawable.altercation));
allItems.add(new ItemObject("offence","0,25 miles - 45 min ago", R.drawable.offence));
allItems.add(new ItemObject("harassment","0,60 miles - 1h ago", R.drawable.harassment));
allItems.add(new ItemObject("doubt","0,5 miles - 48 min ago", R.drawable.doubt));
allItems.add(new ItemObject("incident","0,50 miles - 30 min ago", R.drawable.incident));
return allItems;
}
private void RecyclerListener(){
gridview.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), gridview, new ItemClickListener(){
@Override
public void onClick(View view, int position) {
Alerts.secondPageListener.onSwitchToNextFragment();
}
@Override
public void onLongClick(View view, int position) {
}
}));
}
}
但它显示了错误
java.lang.NullPointerException
at
com.oxilo.mrsafer.fragement.Alerts$1.onClick(Alerts.java:173)
错误提示secondpagelitener为空。
请帮我解决问题。
也在下面的链接上 Replace one fragment with other
他在 Fragment 中也实现了与他已经实现的接口相同的接口 视图寻呼机适配器中的接口。那么为什么他也在片段中实施。根据我的理解,这是错误的,但如果我错了,请纠正我。
【问题讨论】:
-
尝试让片段中的监听器成为非静态的。然后在代码中创建结果后设置监听器
-
我试过这个但同样的错误
-
如果有人投了反对票,请说明原因
-
你能解释一下你想用这段代码做什么吗?
-
我已经写了一个非常描述的摘要,但是,只是想替换视图寻呼机中的一个片段。如果你有一些合适的解决方案分享它
标签: android android-viewpager android-tablayout