Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试在空对象引用上调用虚方法-片段_Java_Android_Android Fragments - Fatal编程技术网

Java 尝试在空对象引用上调用虚方法-片段

Java 尝试在空对象引用上调用虚方法-片段,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试编写一个方法,将数据从片段发送到Android Studio中的另一个片段。我已经创建了这个方法的示例应用程序。它工作得很好 我只是复制了与示例应用程序中完全相同的每个方法和接口,并创建了一个新的片段类(与示例中的相同) sendData工作正常,但sendDataLatLon崩溃-我收到一条消息 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.journaldev.passing

我正在尝试编写一个方法,将数据从片段发送到Android Studio中的另一个片段。我已经创建了这个方法的示例应用程序。它工作得很好

我只是复制了与示例应用程序中完全相同的每个方法和接口,并创建了一个新的片段类(与示例中的相同)

sendData工作正常,但sendDataLatLon崩溃-我收到一条消息

  java.lang.NullPointerException: Attempt to invoke virtual method 'void com.journaldev.passingdatabetweenfragments.FragmentThree.displayReceivedDataLanLon(java.lang.String)' on a null object reference
                                                     at com.journaldev.passingdatabetweenfragments.MainActivity.sendDataLatLon(MainActivity.java:38)
                                                     at com.journaldev.passingdatabetweenfragments.FragmentOne$1.onClick(FragmentOne.java:87)
现在在FragmentOne中-我正在使用按钮-一切正常

 bttnPass.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    SM.sendData(inDataLat.toString().trim() + ";" + inDataLon.toString().trim());
                }

            });
在同一个片段中,当我使用另一个按钮(同上)时,在SLL.sendData行中有一个错误,您可以在上面的logcat中看到

下面是我编写的其余代码

interface SendMessage {
        void sendData(String message);

    }

    interface SendMessageLanLon {
        void sendDataLatLon(String message);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {
            SM = (SendMessage) getActivity();
            SLL = (SendMessageLanLon) getActivity();
        } catch (ClassCastException e) {
            throw new ClassCastException("Error in retrieving data. Please try again");
        }
    }
现在,参考一个日志,我不知道为什么一个对象是空的。我发送的消息不是null,并且方法与工作消息相同

我的方法中的标记值是否有问题? 这是ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        if (position == 0) {
            fragment = new FragmentOne();
        } else if (position == 1) {
            fragment = new FragmentTwo();
        } else if (position == 2) {
            fragment = new FragmentThree();
        }
        return fragment;
    }
或者我可以用同样的方法将值传递给另一个片段,但我不知道如何传递。我刚开始学安卓。试图了解它是如何工作的:/

FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);

这将返回
Null
,因为FragmentThree在活动中没有膨胀。当我们使用
ViewPager
时,只有上一个和下一个
片段
膨胀,而不是全部
片段

使用此代码来解决此问题

活跃 @凌驾 公共void sendDataLatLon(字符串消息){ String tag=“android:switcher:”+R.id.viewPager+”:“+2; viewPagerAdapter.sendData(消息); }

在ViewPagerAdapter类中 字符串消息=”

支离破碎 字符串message1=“”


还有@woodvi什么?为什么要写它?日志上说这行“FragmentThree f=(FragmentThree)getSupportFragmentManager().findFragmentByTag(tag);”返回null。碎片管理器找不到你的碎片,这可能意味着它还没有被连接。@andrewoid那么我应该在哪里或者怎样做?碎片页面管理员对此负责。更新适配器片段的内容有些棘手,有几种方法可以做到这一点。如果在按下此按钮之前滚动到其他片段,是否会发生此崩溃?如果是这样的话,那么我不明白发生了什么,因为所有的片段都应该在那之前连接好,我想你能格式化它吗,因为我不完全明白。。。我不能做:fragment-newfragmentthree(message)-在ViewPageAdapter中,请创建FragmentThree构造函数并传递字符串文件。这很简单我应该在哪里创建它?在FragmentOne中-从我发送字符串的位置或在FragmentThree中接收字符串的位置?我想您没有检查我的代码。请将消息字符串传递到适配器类中,然后您可以将消息字符串发送到FragmentThree类中。如下所示..fragment=新的FragmentThree(消息);
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    if (position == 0) {
        fragment = new FragmentOne();
    } else if (position == 1) {
        fragment = new FragmentTwo();
    } else if (position == 2) {
        fragment = new FragmentThree(message);
    }
    return fragment;
}

@Override
public int getCount() {
    return 3;
}

public void sendData(String message) {
    this.message = message;
}
public FragmentThree(String message1) {
    this.message1 = message1;
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_fragment_three, container, false);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    fragThreeTv = (TextView) view.findViewById(R.id.fragThreeTv);
    fragThreeTv.setText(message1);

}