java - 在android中将数据从第一个选项卡传递到第三个选项卡活动时获取空对象引用
问题描述
我正在使用寻呼机适配器中的接口将数据从第一个选项卡片段传递到第三个选项卡片段。
我的主要活动
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
}
我的第一个片段
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");
}
}
}
在第三个片段中,我正在获取数据
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);
}
}
我的视图寻呼机适配器类
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;
}
}
请帮助我如何解决问题。是否有任何方法可以将数据从选项卡 1 片段传递到第三个选项卡片段。
解决方案
是否有任何方法可以将数据从选项卡 1 片段传递到第三个选项卡片段。
您应该使用 Google 现在推荐的 SharedViewModel 方法,这是非常简单且最佳的方法
https://developer.android.com/topic/libraries/architecture/viewmodel
请参考上面的链接。
推荐阅读
- scala - Akka-http 第一个 websocket 客户端只从 kafka 主题接收数据一次
- vue.js - 初始化 vue-bootstrap b-table 行中的复选框
- angular - 将一组字段动态添加到反应式表单
- c - C中的Matlab引擎函数返回零
- azure - Azure LUIS - 预建地理实体替代方案
- c++ - 如何将数字输出到文件,所有数字都具有相同的精度
- maven - Intellij 2018.1.6 部署 glassfish 应用程序名称包含 .ear 扩展名
- ruby-on-rails - 将临时(非 DB)模型与 simple_form 相关联
- php - PHP Sql Server PDOException:找不到驱动程序
- docker - 在 Arch Linux 上无法访问 Docker