ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)
Posted
技术标签:
【中文标题】ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)【英文标题】:ViewPager - Android Error setCurrentItem(int,boolean) while sending data from fragment to activity 【发布时间】:2018-07-31 14:57:02 【问题描述】:我正在使用 NonSwipeableViewPager
NonSwipeableViewPager.Java
public class NonSwipeableViewPager extends ViewPager
public NonSwipeableViewPager(Context context)
super(context);
public NonSwipeableViewPager(Context context, AttributeSet attrs)
super(context, attrs);
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
// Never allow swiping to switch between pages
return false;
@Override
public boolean onTouchEvent(MotionEvent event)
// Never allow swiping to switch between pages
return false;
我有 MainActivity,我在其中使用带有两个片段的 ViewPager
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context="com.advancetechindia.fragmenttest.MainActivity">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:text="Hello"
android:textSize="20sp"
android:textStyle="bold" />
<com.advancetechindia.fragmenttest.NonSwipeableViewPager
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:id="@+id/viewpager_id"/>
</LinearLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity
private NonSwipeableViewPager viewpager;
private FragmentFirst fragmentFirst=new FragmentFirst();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager=(NonSwipeableViewPager)findViewById(R.id.viewpager_id);
viewpager.setAdapter(new SamplePagerAdapter(
getSupportFragmentManager()));
public void getData(String s)
Log.d("TAG",s);
viewpager.setCurrentItem(1,true);
public class SamplePagerAdapter extends FragmentPagerAdapter
public SamplePagerAdapter(FragmentManager fm)
super(fm);
@Override
public Fragment getItem(int position)
/** Show a Fragment based on the position of the current screen */
if (position==0)
return new FragmentFirst();
else return new FragmentTwo();
@Override
public int getCount()
return 2;
frag_one.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<EditText
android:layout_
android:layout_
android:id="@+id/et_id"
android:hint="texthere"/>
<Button
android:layout_
android:layout_
android:id="@+id/btn_id"
android:text="Fire"
android:onClick="GetString"/>
</LinearLayout>
</RelativeLayout>
frag_one.xml
FragmentFirst.java
public class FragmentFirst extends Fragment
private EditText et;
private Button btn;
private MainActivity mainact;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.frag_one, container,
false);
mainact=new MainActivity();
et=(EditText)rootView.findViewById(R.id.et_id);
btn=(Button)rootView.findViewById(R.id.btn_id);
btn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
String abc=et.getText().toString();
Log.d("TAG",abc);
mainact.getData(abc);
);
return rootView;
另外,我还有一个 Fragment--- FragmentTwo.java
当我点击火按钮时,它会调用
getData(String s)
我得到字符串的 MainActivity 方法,但它在
上显示错误viewpager.setCurrentItem(int,boolean)
请让我摆脱这个障碍。谢谢
错误
10:54:46.205 31492-31492/com.advancetechindia.fragmenttest E/AndroidRuntime: 致命异常: main 进程:com.advancetechindia.fragmenttest,PID:31492 java.lang.NullPointerException:尝试调用虚拟方法'void com.advancetechindia.fragmenttest.NonSwipeableViewPager.setCurrentItem(int, boolean)' 在空对象引用上 在 com.advancetechindia.fragmenttest.MainActivity.getData(MainActivity.java:30) atcom.advancetechindia.fragmenttest.FragmentFirst$1.onClick(FragmentFirst.java:37)at android.view.View.performClick(View.java:5612)at android.view.View$PerformClick.run(View.java:22285)at android.os.Handler.handleCallback(Handler.java:751)at android.os.Handler.dispatchMessage(Handler.java:95)at android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6123) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
【问题讨论】:
"mainact=new MainActivity()"?这是什么?永远不要使用new
创建 Activity 实例。
【参考方案1】:
mainact=new MainActivity();
是创建新对象,ViewPager
在旧对象中存活,因此您需要访问 MainActivity
的旧对象
((MainActivity)getActivity()).getData(abc);
【讨论】:
非常感谢 Guyzz !它有效! 非常欢迎!!快乐的编码......如果你对答案感到满意,那就放弃投票。【参考方案2】:在你的 FragmentFirst.java
中替换它mainact.getData(abc);
与
((MainActivity)getActivity()).getData(abc);
【讨论】:
以上是关于ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)的主要内容,如果未能解决你的问题,请参考以下文章
在使用ViewPager时尝试从其父活动修改片段时出现空指针异常