在搜索互联网(使用Google)后,我没有找到任何问题的答案。
我发现的一切都是关于为onClickListener
错误设置View
的人。我想在我的情况下这是同样的问题,但没有其他问题与我的相符。
This似乎是同样的问题......它没有答案。
我在Fragment
中设置了三个ViewPager
和AppCompatActivity
。
viewPager = (ViewPager) findViewById(R.id.main_view_pager);
viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
由SectionsPagerAdapter
处理。
public class SectionsPagerAdapter extends FragmentPagerAdapter {
SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return MainTextHolder.newInstance(tabIndicatorOnClick);
case 1:
return PostWriter.newInstance(tabIndicatorOnClick);
case 2:
return TopPage.newInstance(tabIndicatorOnClick);
default:
return Error.newInstance();
}
}
@Override
public int getCount() {
return 3;
}
// ... more methods
}
在每个Fragment
中,我都有一些内容加上自定义TabIndicator
。
(以下xml
文件是我的指标View
<?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="wrap_content" >
<View
android:id="@+id/fragment_divider_one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="one" />
<View
android:id="@+id/fragment_divider_two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="two" />
<View
android:id="@+id/fragment_divider_three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="three" />
</LinearLayout>
然后我为OnClickListener
View
方法中的每个Fragment
(分隔符)设置了onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState)
。 OnClickListener
已在我Activity
中准备ViewPager
,我也会实例化Item
,以便我可以更改当前的Fragment
private final View.OnClickListener tabIndicatorOnClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getTag().toString().equals("one"))
viewPager.setCurrentItem(0, true); // second argument for smooth transition
else if (view.getTag().toString().equals("two"))
viewPager.setCurrentItem(1, true);
else if (view.getTag().toString().equals("three"))
viewPager.setCurrentItem(2, true);
}
};
/标签符。
OnClickListener
我将Fragment
传递给我的newInstance(View.OnClickListener tabIndicatorOnClick)
方法,将public static MainTextHolder newInstance(View.OnClickListener tabIndicatorOnClick) {
MainTextHolder fragment = new MainTextHolder();
Bundle args = new Bundle();
fragment.putIndicatorTabIndicatorOnClick(tabIndicatorOnClick);
fragment.setArguments(args);
fragment.setRetainInstance(true);
return fragment;
}
传递给putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick)
。
这是针对其中一个片段的。它与其他人完全相同!
Void
我的Interface
方法是OnClickListener
中的Class
。它只是将Fragment
应用于@Override
public void putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick) {
this.tabIndicatorOnClick = tabIndicatorOnClick;
}
(ConfigurationChange
)。
ConfigurationChange
是的, 。它工作得很好......直到OnClickListener
发生。在我的情况下,我使用更改方向来测试它。
在View
之后发生的事情是一切正常。 Fragment
已应用于所有 tabIndicatorOnClick
中的所有 OnClickListener
,但 Fragment
OnClickListener
是第二个和第三个View
中的空对象引用。
所以在 PostWriter 和 TopPage 中,MainTextHolder
上的Fragment
甚至还不是tabIndicatorOnClick
永恒的理由。但它变得更好:在null object reference
ViewPager
Item
不是Tab
,但它不会更改OnClickListener
&#39; s {{1不再了。它运行代码,但不会滚动null object references
。
开启&#34;不要保留设备的活动&#34; ind 开发人员选项并离开应用,所有{{1} } {是MainTextHolder
。即使是那些ConfigurationChange
。
OnClickListener
Fragment
传递到我的第一个Fragment
之后,但它无法正常工作且剩余的null object reference
&#39} 它甚至没有通过/ Activity
。
可以通过销毁ViewPager
然后重新加载来复制问题。
......我不知道出了什么问题。我希望我能正确地构建我的问题。
minSdkVersion : 14
targetSdkVersion : 25
我的OnClickListener
已经有SpringIndicator了。这不包含OnClick
,因此我添加了自己的&#34;重叠&#34; 指标,这些指标具有所需的TabIndicator
功能。我也喜欢它的外观,但如果你能为我xml
提供更好的解决方案,我也很乐意将其作为答案。
我遇到了将该方法多次放入:onClick
OnClickListener
属性的解决方案,但为此,我需要为每个Fragment
创建相同的ViewPager
这不是真正的好方法,它也不是解决我的问题,而是解决它的方法。 - 我需要将Fragment
传递给我的xml
,然后从OnClickListener
调用该方法,正如我所说,这只是另一种方式,而不是我喜欢的方式做到这一点。我也不知道它是否有效。我很可能会测试它。
Fragment
中的其他OnClickListener
仍可正常使用。正如我所说,问题在于null object reference
本身无法正常工作/成为{{1}}。
答案 0 :(得分:2)
首先,编写详细的问题描述做得很好。 StackOverflow上的许多提问者都可以从这个问题的能力中学习表达问题。
这个错误似乎来自于不考虑Fragment生命周期的变化。在ViewPager中,Fragments将通过各种状态,包括隐藏和显示在临时屏幕外时,如果它们在屏幕外并且系统释放内存,则暂停和恢复,如果Android系统决定保存实例状态,则最终创建和销毁您的活动(例如来自配置更改)。在后一种情况下,Android将尝试从ViewPager中保存的实例状态恢复Fragments的状态。由于你的Fragments没有办法保存它们在参数中传递的View.OnClickedListener
,因此当它们被恢复时会导致null
指针,这会导致你的错误。
要修复错误,我建议您不要将View.OnClickedListener
作为参数传递给Fragments。相反,通过您的Activity中的公共方法将OnClickListener
公开给您的片段,并让片段自己在onResume()
中获取。这样,您可以保证片段在处于恢复状态时将引用View.OnClickedListener
。所以你的onResume()
可能看起来像这样:
@Override
public void onResume() {
OnClickListener onClickListener = ((MyActivity) getActivity).getOnClickListener();
putIndicatorTabIndicatorOnClick(onClickListener);
}
由于您已在onResume()
中进行了设置,因此应将其删除onPause()
:
@Override
public void onPause() {
//set the onClickListener to null to free up the resource
}
使用此类onResume()
和onPause()
来释放听众的资源是开发人员指南中推荐的方法。
当然,您必须通过检查onCreate(Bundle savedInstanceState)
中保存的状态并正确恢复它来确保您的Activity也处理自己的生命周期。
请注意,可以通过多种方式触发保存实例状态和恢复:
您将能够使用这些方法之一来确定您是否正确处理了活动和碎片的生命周期。