android - 将复选框输入从一个片段传递到另一个片段
问题描述
我在一个片段中有一个复选框列表(我们称之为 FragmentA),我有一个包含 2 个片段(FragmentB 和 C)的活动。如果选中了一个复选框,我想在片段 C 中显示一条消息,表明该特定复选框已被选中。我需要帮助,因为我不知道如何将 (isChecked) 从 FragmentA 传递到 Fragment C。
片段A.java
CB16.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB16.getId());
if (CB16.isChecked()) {
score = score + finalScore;
} else if (!CB16.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB17.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB17.getId());
if (CB17.isChecked()) {
score = score + finalScore;
} else if (!CB17.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB18.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB18.getId());
if (CB18.isChecked()) {
score = score + finalScore;
} else if (!CB18.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB19.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB19.getId());
if (CB19.isChecked()) {
score = score + finalScore;
} else if (!CB19.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB20.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB20.getId());
if (CB20.isChecked()) {
score = score + finalScore;
} else if (!CB20.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB21.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB21.getId());
if (CB21.isChecked()) {
score = score + finalScore;
} else if (!CB21.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
CB22.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int finalScore = Values.getInstance().updateScore(CB22.getId());
if (CB22.isChecked()) {
score = score + finalScore;
} else if (!CB22.isChecked()) {
score = score - finalScore;
tv.setText(" " + score);
}
}
});
btnFragMale6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivityMale)getActivity()).setViewPager(6); }
});
return view;
}
分数不影响 FragmentC。
包含片段 B 和 C 的 Activity
FragmentB fragmentb = new FragmentB();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.constraintLayout1,fragmentB,fragmentB.getTag())
.commit();
FragmentC fragmentc = new FragmentC();
FragmentManager fragmentManagerrslt = getSupportFragmentManager();
fragmentManagerC.beginTransaction()
.replace(R.id.constraintLayout2,fragmentC,fragmentC.getTag())
.commit();
片段C活动
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_fragment_c, container, false);
Log.d(TAG, "onCreateView: started");
return view;
}
解决方案
您可以通过两种方式在活动和片段之间共享信息。一种是在每个开关上手动将它们作为参数传递。第二个(听起来与您可能想要的最相似)是将复选框数据存储在共享首选项中。
将它们作为参数传递
由于您提到您的片段在不同的活动中,您首先必须将您的参数(复选框值)传递给下一个活动,然后可以将它们传递给片段。
将参数传递给新活动的示例
将一个布尔值checkboxValue
和该复选框的唯一 id 放入新的Intent
.
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Bundle b = new Bundle();
b.putBoolean("key", checkboxValue); //Your id
intent.putExtras(b); //Put your id to your next Intent
startActivity(intent);
finish();
然后在你的 new 中获取 id Activity
:
Bundle b = getIntent().getExtras();
boolean checkboxValue = false; // or other values
if(b != null)
value = b.getBoolean("key", false);
将参数传递给片段的示例
创建片段时,只需为其添加参数,如下所示:
Fragment f = new FragmentC();
Bundle b = new Bundle();
b.putBoolean("uniqueId", checkboxValue);
f.setArguments(b);
然后在你的FragmentTransaction
onCreate
稍后在oronCreateView
方法中将其从片段中取出,如下所示:
Bundle args = getArguments();
int checkboxValue = args.getBoolean("uniqueId", false);
使用共享首选项
Shared Preferences 是您应用的全球数据存储。您可以在应用程序的任何部分输入和取出数据。下面显示了一个放置数据的示例
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences()
SharedPreferences.Editor edit = prefs.edit()
edit.putBoolean("checkbox1", checkboxValue)
edit.apply()
当您想从应用程序的其他部分获取数据时,您可以这样做:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences()
boolean checkboxValue = prefs.get("checkbox1", false)
这是在您的应用程序中存储全局设置的好方法!在这里了解更多
推荐阅读
- go - 尝试下载 git 存储库时 pkg-config 出错
- python - python覆盖一个不同名称的api类方法
- javascript - 为什么我在 v-for 的插槽中只有一个元素?
- laravel - Route:list 在本地机器上工作,但在 laravel 的服务器上出错
- java - 为什么文件没有写入内部存储?
- karate - 如何检查在回归下运行的所有功能文件的报告?
- ssl - 使用 JDBC 瘦客户端通过 SSL 连接到 Ignite 集群
- ms-access - 当 MS-Access 窗体上的另一个组合框的值被修改时,如何更新该窗体上的组合框?
- mysql - DB Schema 设计 Parent Children 孙子
- haskell - 将 Data.ByteString.Lazy 转换为 CStringLen 的最有效方法