如何在Android开发中正确获取ViewPager的当前“页码”
如何在Android开发中正确获取ViewPager的当前“页码”
抱歉,如果我的问题很愚蠢,我的错误很明显,但我现在学习Java和Android开发已经一周了,所以对于我代码的任何建设性批评,甚至与我的问题无关的批评,我都非常欢迎!谢谢你的帮助和时间。\n我目前的情况是,我正在尝试确定我在ViewPager设置中处于第几页。基本上,我有一堆创建的\"forms\",它们是\"UserFrament.java\"片段的实例。该表单从几个编辑文本中收集用户输入,并在按钮按下时,希望存储数据并转到下一个片段(我目前认为这是有效的)。然而,现在,我正在尝试确定我当前所在的页面,以便如果它在最后一页(存储所有数据,将其放入一个意图,然后启动另一个活动以处理数据),可以让我的\'onClick\'方法执行不同的任务。\n所以,目前我在我的\'UserFragment.java\'里有以下代码:\n
int currentviewnum = ((FirstFragment) getActivity()).getPager().getCurrentItem(); String pagenum = Integer.toString(currentviewnum);
\n现在,FirstFragment是设置ViewPager等的活动。我的适配器是\"FragmentAdapter.java\"。\n使用我的当前设置,当我将字符串\'pagenum\'打印到每个ViewPager页面的随机文本视图上时,当我切换到下一页(或使用我的按钮导航)时,数字就不正确了。假设我有5个页面(用户定义有多少个表单),那么FirstFragment会接收到一个定义它创建的实例数量的意图。数字序列是像这样的:“0, 0, 1, 2, 3\"。然后当我滚动回来时,它会做出这样的行为:“3, 2, 3, 2, 1\"。所以我不知道为什么它会如此混乱。\n以下是我的UserFragment.java的代码:\n
package com.example.thinice; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class UserFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.layout_avgcalcform, container, false); final EditText markc = (EditText)rootView.findViewById(R.id.editTextASSMARK); final EditText marktotc = (EditText)rootView.findViewById(R.id.editTextASSTOT); final EditText assvalc = (EditText)rootView.findViewById(R.id.editTextASSWORTH); int currentviewnum = ((FirstFragment) getActivity()).getPager().getCurrentItem(); String pagenum = Integer.toString(currentviewnum); TextView tv = (TextView) rootView.findViewById(R.id.avg_testtv); tv.setText(pagenum); Button b = (Button) rootView.findViewById(R.id.button1); b.setOnClickListener( new View.OnClickListener(){ public void onClick(View v){ int currentviewnum = ((FirstFragment) getActivity()).getPager().getCurrentItem(); ((FirstFragment) getActivity()).saveData(new Question(markc.getText().toString(),marktotc.getText().toString(),assvalc.getText().toString())); ((FirstFragment) getActivity()).getPager().setCurrentItem(currentviewnum+1); } }); return rootView; } }
\n如果您需要查看我的其他代码,请告诉我。但这真的让我很烦恼。\n所以,如果有人能帮帮我,那就太好了!非常感谢您!
问题出现的原因:用户想要从ViewPager中获取当前的页面编号,但对于如何正确获取这个编号感到困惑。
解决方法:
1. 在Fragment中使用setArguments方法来修改Fragment。通过传递页面的编号作为参数来修改Fragment。可以参考以下链接了解setArguments方法的使用:[How to use setArguments() and getArguments() methods in Fragments?](https://stackoverflow.com/questions/5425568)
2. 在持有ViewPager的FragmentActivity中使用以下代码来获取当前页面的索引:
mViewPager.setOnPageChangeListener(this); mViewPager.getCurrentItem();
3. 在FragmentPagerAdapter中将当前页面的索引传递给Fragment:
public Fragment getItem(int position) { UserFragment form = new UserFragment(); Bundle bundl = new Bundle(); bundl.putString("index", getCurrentPage); form.setArguments(bundl); return form; }
希望以上方法能够帮助解决问题。如果需要更详细的实现步骤,请提供更多细节。谢谢!
问题出现的原因是ViewPager在实例化当前页面的前后页面的Fragment,以实现平滑的滑动效果。通过调用setOffScreenPageLimit(int)方法可以设置当前页面两侧应该保留的页面数量,默认为1。需要注意的是,ViewPager的第一个位置是0,而不是1。
解决方法是在PagerAdapter的getItem()方法中获取页面的位置,并将其作为参数传递给每个UserFragment的实例。然后在UserFragment中可以通过getArguments().getInt("page_position")来获取页面位置。
另外,可以尝试使用fragments.get(position)来获取Fragment。这行代码的作用是根据位置获取相应的Fragment实例。
以下是对上述内容进行整理的文章:
在Android开发中,如果需要从ViewPager中获取当前页面的页码,可能会出现一些错误的页码。这是因为ViewPager为了实现平滑的滑动效果,在实例化当前页面的前后页面的Fragment。通过setOffScreenPageLimit(int)方法可以设置当前页面两侧应该保留的页面数量,默认为1。需要注意的是,ViewPager的第一个位置是0,而不是1。
具体来说,当设置了ViewPager的适配器并显示第一页(position=0)时,第二页的Fragment也会被创建,而当前页面的位置仍然是0。当滑动到第二页时,第三个Fragment会被创建,此时当前页面的位置是1。依此类推,当滑动到第四页时,当前页面的位置是2。
为了获取页面位置,可以在PagerAdapter的getItem()方法中获取位置,并将其作为参数传递给每个UserFragment的实例。然后在UserFragment中可以通过getArguments().getInt("page_position")来获取页面位置。
以下是一个示例代码:
public Fragment getItem(int position) { UserFragment fragment = new UserFragment(); Bundle args = new Bundle(); args.putInt("page_position", position + 1); fragment.setArguments(args); return fragment; }
然后,在UserFragment中可以通过以下代码获取页面位置并显示在TextView中:
TextView tv = (TextView) rootView.findViewById(R.id.avg_testtv); tv.setText(String.valueOf(getArguments().getInt("page_position")));
另外,还可以尝试使用fragments.get(position)来获取Fragment实例,具体代码如下:
public Fragment getItem(int position) { UserFragment fragment = fragments.get(position); Bundle args = new Bundle(); args.putInt("page_position", position + 1); fragment.setArguments(args); return fragment; }
以上就是解决这个问题的方法,希望对你有帮助。如果还有其他问题,请随时提问。