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时尝试从其父活动修改片段时出现空指针异常

如何将值从其他活动传递给 viewpager 片段?

如何将活动中的searchview的输入发送到该活动的视图寻呼机中的片段

将数据从活动发送到片段android工作室[重复]

将数据从片段发送到活动,无需任何事件处理或侦听器

如何共享元素从片段到活动的过渡