Android 滚动到特定视图的顶部会导致片段中出现NPE吗?
我有一个活动和一个片段。我在活动中有两个按钮,单击这两个按钮,我将加载相同的片段。在第二个按钮上单击“我想滚动到textview的顶部位置”,片段将Android 滚动到特定视图的顶部会导致片段中出现NPE吗?,android,android-fragments,Android,Android Fragments,我有一个活动和一个片段。我在活动中有两个按钮,单击这两个按钮,我将加载相同的片段。在第二个按钮上单击“我想滚动到textview的顶部位置”,片段将NestedScrollView作为其父级 我使用界面来区分单击了哪个按钮 interface HomeFragmentListener { fun shouldScrollToCampaign(scroll: Boolean) } class MainActivity : AppCompatActivity(),... { privat
NestedScrollView
作为其父级
我使用界面来区分单击了哪个按钮
interface HomeFragmentListener {
fun shouldScrollToCampaign(scroll: Boolean)
}
class MainActivity : AppCompatActivity(),... {
private var homeFragmentListener: HomeFragmentListener? = null
fun setHomeFragmentListener(homeFragmentListener: HomeFragmentListener? ){
this.homeFragmentListener = homeFragmentListener
}
}
下面是我的第二个按钮点击代码
loadFragment(HomeFragment())
homeFragmentListener?.shouldScrollToCampaign(true)
片段加载如下所示
private fun loadFragment(fragment: Fragment?) {
val transaction = supportFragmentManager.beginTransaction()
fragment?.let { transaction.replace(R.id.fl_activity_main, it) }
transaction.commit()
}
class HomeFragment : Fragment(), HomeFragmentListener {
override fun shouldScrollToCampaign(scroll: Boolean) {
if (scroll) {
nestedScrollView {
nsv_fragment_home.scrollTo(
0,
textView.top
)
}
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
(activity as MainActivity).setHomeFragmentListener(this)
..}
}
我的片段如下
private fun loadFragment(fragment: Fragment?) {
val transaction = supportFragmentManager.beginTransaction()
fragment?.let { transaction.replace(R.id.fl_activity_main, it) }
transaction.commit()
}
class HomeFragment : Fragment(), HomeFragmentListener {
override fun shouldScrollToCampaign(scroll: Boolean) {
if (scroll) {
nestedScrollView {
nsv_fragment_home.scrollTo(
0,
textView.top
)
}
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
(activity as MainActivity).setHomeFragmentListener(this)
..}
}
当加载片段时,我也在调用网络代码,只需删除侦听器的set方法,并在创建片段对象时初始化侦听器,然后将其转换到接口即可 尝试:
HomeFragment frg = HomeFragment()
homeFragmentListener = frg as HomeFragmentListener
loadFragment(frg)
homeFragmentListener?.shouldScrollToCampaign(true)
如果该方法已附加到活动,则可以在片段中调用该方法。单击活动中的第二个按钮后,请尝试以下操作:
var homeFragment = supportFragmentManager.findFragmentById(R.id.fl_activity_main) as HomeFragment
homeFragment.scrolToTop()
在第二个按钮代码中,当调用
loadFragment(HomeFragment())
时,上一个片段现在被销毁。销毁片段的引用仍存储在homeFragmentListener
中。因此,当调用实现接口的方法时,textview
将为空。即使您替换到正确的实例,它仍然有100%的可能性失败,因为当您调用shouldscrolldtocampaign
有两种方法可以解决此问题:
class HomeFragment : Fragment() {
companion object {
private const val MY_BOOLEAN = "my_boolean"
fun newInstance(aBoolean: Boolean) = HomeFragment().apply {
arguments = Bundle(1).apply {
putBoolean(MY_BOOLEAN, aBoolean)
}
}
}
}
这就是如何实例化您的
HomeFragment
并在onViewCreated
方法中检查MY_BOOLEAN
是否设置为true,并基于该滚动查看您想要滚动的视图。同一问题@AfinasEMI am获得textView的NPE您以前初始化过textView吗?是的,它在我的xml布局中定义。我还以编程的方式为它设置文本,它可以工作。我认为很难知道所提供的代码会发生什么。您是否可以包括onClick代码、活动和片段布局以及异常堆栈?您是否可以发布日志,其中包括用于发布日志的NPE.+2。