尝试在空对象引用上调用虚方法 - 片段Android [重复]

问题描述 投票:2回答:2

这个问题在这里已有答案:

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

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

The MainActivity looks like this 
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage, FragmentOne.SendMessageLanLon {

    TabLayout tabLayout;
    ViewPager viewPager;
    ViewPagerAdapter viewPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(viewPagerAdapter);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    @Override
    public void sendData(String message) {
        String tag = "android:switcher:" + R.id.viewPager + ":" + 1;
        FragmentTwo f = (FragmentTwo) getSupportFragmentManager().findFragmentByTag(tag);
        f.displayReceivedData(message);
    }

    @Override
    public void sendDataLatLon(String message) {
        String tag = "android:switcher:" + R.id.viewPager + ":" + 2;
        FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
        f.displayReceivedDataLanLon(message);
    }
}

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。我发送的消息不是null,方法是SAME作为工作方式。

我的方法中的标记值是否有问题?这是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;
    }

或者也许我可以使用相同的方法将值传递给另一个片段,我不知道如何。我刚开始学习android。试图了解它是如何工作的:/

java android android-fragments
2个回答
0
投票

用户此代码来解决此问题

在Activity @Override public void sendDataLatLon(String message){String tag =“android:switcher:”+ R.id.viewPager +“:”+ 2; viewPagerAdapter.sendData(消息); }

在ViewPagerAdapter类String中消息=“”;

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;
}

在FragmentThree Fragment String中message1 =“”;

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);

}

0
投票
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);

这是返回Null,因为FragmentThree不是活动中的inflating。当我们使用ViewPager时,只有前一个和下一个Fragment膨胀不是所有Fragment

© www.soinside.com 2019 - 2024. All rights reserved.