可从 activity 分片到片段
Parcelable from activity to fragment
我是 parcelable 的新手,我正在尝试将数据从 Activity (MainActivity) 传递到片段 (MainFragment),但我很难做到这一点。
我用所有(可打包的)数据创建了一个 class (InfoBean)。当我 从 MainActivity 发送数据时,来自 bean.newTheme (2131296447) 的数据就在那里,但很快当我尝试 在片段 中检索时,值为 0!
有人可以看看我做错了什么吗?感谢您的帮助。
发送数据(主要Activity):
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
InfoBean bean = new InfoBean();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureSharedPreferences theme = SecureSharedPreferences.getInstance(this, "MyPrefsFile");
int newTheme = theme.getInt("themeCustom", 0);
bean.newTheme = newTheme;
Bundle bundle = new Bundle();
bundle.putInt("theme", bean.newTheme); // debug shows value 2131296447
MainFragment mf = new MainFragment();
mf.setArguments(bundle);
//
}
}
检索数据(MainFragment):
public class MainFragment extends Fragment {
InfoBean bean = new InfoBean();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//
Bundle bundle = this.getArguments(); // Debugging shows 0!
if (bundle != null) {
bean.newTheme = bundle.getInt("theme");
}
if (bean.newTheme == 2131296447) { // White Theme
mCardView1.setBackgroundColor(Color.parseColor("#E8EBED"));
} else { // Dark Theme
mCardView1.setBackgroundColor(Color.parseColor("#282929"));
relLay.setBackgroundColor(Color.parseColor("#1B1C1C"));
}
return rootView;
}
}
InfoBean.class:
public class InfoBean implements Parcelable {
public int newTheme;
public int THEME_DARK = R.style.DarkTheme;
public int THEME_LIGHT = R.style.LightTheme;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.newTheme);
dest.writeInt(this.THEME_DARK);
dest.writeInt(this.THEME_LIGHT);
}
public InfoBean() {
}
protected InfoBean(Parcel in) {
this.newTheme = in.readInt();
this.THEME_DARK = in.readInt();
this.THEME_LIGHT = in.readInt();
}
public static final Parcelable.Creator<InfoBean> CREATOR = new Parcelable.Creator<InfoBean>() {
@Override
public InfoBean createFromParcel(Parcel source) {
return new InfoBean(source);
}
@Override
public InfoBean[] newArray(int size) {
return new InfoBean[size];
}
};
}
更新
由于您已将片段嵌入 xml,因此无法将值传递给片段 class。为此,您需要通过 java 代码使其执行并删除 xml。制作片段事务然后它将起作用
更新
您应该尝试在片段的 onCreate 方法中检索值。
@overide
protect void onCreate(bundle onSavedInstance){
if (savedInstance != null) {
bean.newTheme = bundle.getInt("theme");
}
}
试试这个
if (bundle != null) {
bean.newTheme = bundle.getInt("theme");
}
而不是
if (bundle != null) {
bean.newTheme = bundle.getParcelable("theme");
}
在您的 activity 中,您使用的是 .putInt("theme" .....) 但在您调用 .getParcelable("theme") 的片段中。您得到 0 是因为您正在尝试获取两种不同的数据类型。
如果您在 XML 中嵌入了片段,则不能像在程序中那样使用 setArguments()
。最好使用动态片段创建。
android 开发者网站中有一个简短示例可以指导您:http://developer.android.com/reference/android/app/Fragment.html 当您嵌入片段时还有另一种实现以及如何处理参数。
这里还有另一个资源可能对您有帮助:
Set arguments of fragment from activity
我是 parcelable 的新手,我正在尝试将数据从 Activity (MainActivity) 传递到片段 (MainFragment),但我很难做到这一点。
我用所有(可打包的)数据创建了一个 class (InfoBean)。当我 从 MainActivity 发送数据时,来自 bean.newTheme (2131296447) 的数据就在那里,但很快当我尝试 在片段 中检索时,值为 0!
有人可以看看我做错了什么吗?感谢您的帮助。
发送数据(主要Activity):
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
InfoBean bean = new InfoBean();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureSharedPreferences theme = SecureSharedPreferences.getInstance(this, "MyPrefsFile");
int newTheme = theme.getInt("themeCustom", 0);
bean.newTheme = newTheme;
Bundle bundle = new Bundle();
bundle.putInt("theme", bean.newTheme); // debug shows value 2131296447
MainFragment mf = new MainFragment();
mf.setArguments(bundle);
//
}
}
检索数据(MainFragment):
public class MainFragment extends Fragment {
InfoBean bean = new InfoBean();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//
Bundle bundle = this.getArguments(); // Debugging shows 0!
if (bundle != null) {
bean.newTheme = bundle.getInt("theme");
}
if (bean.newTheme == 2131296447) { // White Theme
mCardView1.setBackgroundColor(Color.parseColor("#E8EBED"));
} else { // Dark Theme
mCardView1.setBackgroundColor(Color.parseColor("#282929"));
relLay.setBackgroundColor(Color.parseColor("#1B1C1C"));
}
return rootView;
}
}
InfoBean.class:
public class InfoBean implements Parcelable {
public int newTheme;
public int THEME_DARK = R.style.DarkTheme;
public int THEME_LIGHT = R.style.LightTheme;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.newTheme);
dest.writeInt(this.THEME_DARK);
dest.writeInt(this.THEME_LIGHT);
}
public InfoBean() {
}
protected InfoBean(Parcel in) {
this.newTheme = in.readInt();
this.THEME_DARK = in.readInt();
this.THEME_LIGHT = in.readInt();
}
public static final Parcelable.Creator<InfoBean> CREATOR = new Parcelable.Creator<InfoBean>() {
@Override
public InfoBean createFromParcel(Parcel source) {
return new InfoBean(source);
}
@Override
public InfoBean[] newArray(int size) {
return new InfoBean[size];
}
};
}
更新
由于您已将片段嵌入 xml,因此无法将值传递给片段 class。为此,您需要通过 java 代码使其执行并删除 xml。制作片段事务然后它将起作用
更新
您应该尝试在片段的 onCreate 方法中检索值。
@overide
protect void onCreate(bundle onSavedInstance){
if (savedInstance != null) {
bean.newTheme = bundle.getInt("theme");
}
}
试试这个
if (bundle != null) {
bean.newTheme = bundle.getInt("theme");
}
而不是
if (bundle != null) {
bean.newTheme = bundle.getParcelable("theme");
}
在您的 activity 中,您使用的是 .putInt("theme" .....) 但在您调用 .getParcelable("theme") 的片段中。您得到 0 是因为您正在尝试获取两种不同的数据类型。
如果您在 XML 中嵌入了片段,则不能像在程序中那样使用 setArguments()
。最好使用动态片段创建。
android 开发者网站中有一个简短示例可以指导您:http://developer.android.com/reference/android/app/Fragment.html 当您嵌入片段时还有另一种实现以及如何处理参数。
这里还有另一个资源可能对您有帮助:
Set arguments of fragment from activity