简体   繁体   English

在 android 中将数据从第一个选项卡传递到第三个选项卡活动时获取 null object 引用

[英]Getting null object reference when passing data from 1st tab to 3rd tab activity in android

I am passing data from the first tab fragment to the 3rd tab fragment using an interface in the pager adapter.我正在使用寻呼机适配器中的接口将数据从第一个选项卡片段传递到第三个选项卡片段。

My Main Activity我的主要活动

public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage {
    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tabLayout = findViewById(R.id.tabLayout);
        viewPager = findViewById(R.id.viewPager);
        tabLayout.addTab(tabLayout.newTab().setText("Fragment1"));
        tabLayout.addTab(tabLayout.newTab().setText("Fragment2"));
        tabLayout.addTab(tabLayout.newTab().setText("Fragment3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        final MyAdapter adapter = new MyAdapter(this, getSupportFragmentManager(),
                tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
            }
        });
    }

    @Override
    public void sendData(String message) {
        System.out.println("message1"+message);
        String tag = "android:switcher:" + R.id.viewPager + ":" + 2; // here i am getting the value of tag but in the line below it is throwing null object reference.
        FragmentThree lah = (FragmentThree)getSupportFragmentManager().findFragmentByTag(tag);
if(message != null){
    assert lah != null;
    lah.displayReceivedData(message); // here i am getting null 
}

My First Fragment我的第一个片段

public class FragmentOne extends Fragment {
    private SendMessage sendMessage;
    public FragmentOne() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.fragment1, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Button btnPassData = view.findViewById(R.id.btnPassData);
        final EditText inData = view.findViewById(R.id.passMessage);
        btnPassData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendMessage.sendData("hlahari");
            }
        });
    }
    interface SendMessage {
        void sendData(String message);
    }
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            sendMessage = (SendMessage) getActivity();
        }
        catch (ClassCastException e) {
            throw new ClassCastException("Error in retrieving data. Please try again");
        }
    }
}

And in third fragment I am getting data在第三个片段中,我正在获取数据

public class FragmentThree extends Fragment {
    private TextView textView;
    public FragmentThree() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.fragment3, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        textView = view.findViewById(R.id.txtData);
    }
    public void displayReceivedData(String message)
    {
        System.out.println("message3"+message);
        textView.setText("Data received: "+message);
    }

} }

My view Pager adapter class我的观点寻呼机适配器 class

class MyAdapter extends FragmentPagerAdapter {
   Context context;
   int totalTabs;
   public MyAdapter(Context c, FragmentManager fm, int totalTabs) {
      super(fm);
      context = c;
      this.totalTabs = totalTabs;
   }
   @Override
   public Fragment getItem(int position) {
      switch (position) {
         case 0:
            FragmentOne frag1 = new FragmentOne();

         return frag1;
         case 1:
            FragmentTwo frag2 = new FragmentTwo();
         return frag2;
         case 2:
             FragmentThree frag3 = new FragmentThree();
         return frag3;
         default:
         return null;
      }
   }
   @Override
   public int getCount() {
      return totalTabs;
   }
}

Please help me how to solve the problem.请帮助我如何解决问题。 Is there any method to pass data from tab 1 fragment to 3rd tab fragment.是否有任何方法可以将数据从选项卡 1 片段传递到第三个选项卡片段。

Is there any method to pass data from tab 1 fragment to 3rd tab fragment.是否有任何方法可以将数据从选项卡 1 片段传递到第三个选项卡片段。

you should use SharedViewModel approach which is recommended by Google now and it is very easy and best approach您应该使用 Google 现在推荐的 SharedViewModel 方法,这是非常简单且最佳的方法

https://developer.android.com/topic/libraries/architecture/viewmodel https://developer.android.com/topic/libraries/architecture/viewmodel

Please refer to the above link.请参考上面的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 获取空对象引用如果我在第三项活动之前开始第二项活动(如果我直接从第一项移到第三项,则没有错误) - Getting null object reference If i start 2nd activity before 3rd activity (No error if I move from 1st to 3rd directly) 如何将文本视图数据从第一活动发送到第三活动 - How to send Text View data from 1st activity to 3rd activity 如何获得有关按钮单击第一活动的信息并在第三活动中使用它的信息? -安卓 - How to get information about a button click on 1st activity and use it in the 3rd activity? - android JComboBox仅在从第1到第2时才更改组件(而不是从第3到第2时) - JComboBox changes components only when going from 1st to 2nd (Not from 3rd to 2nd) 通过递归交换LinkedList中的每个第一和第三元素数据 - Swap every 1st and 3rd element data in LinkedList by Recursion 从适配器单击第一个选项卡recyclerview项时,如何为第二个选项卡设置动画? - how to animate to 2nd tab when 1st tab recyclerview item is clicked from adapter? 从选项卡活动 android 传递附加信息 - Passing extras from tab activity android 将变量从活动传递到片段时为空对象引用 - Null object reference when passing variable from activity to fragment 切换到第3个选项卡后,Tabhost的内容重置 - Contents of Tabhost getting reset after switching to 3rd tab Android-从片段中的对话框激发的意图打开第三个选项卡 - Android - Open 3rd Tab from Intent fired from Dialog in Fragment
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM