从活动到片段

时间:2016-04-02 08:09:26

标签: android android-fragments bundle parcelable

我是parcelable的新手,我正在尝试将数据从Activity(MainActivity)传递到片段(MainFragment),但我很难做到这一点。

我创建了一个包含所有(parcelable)数据的类(InfoBean)。当我从MainActivity 发送数据时,来自bean.newTheme( 2131296447 )的数据就在那里,但是当我尝试在片段中检索时 strong>,值 0

有人可以看看,我做错了什么?谢谢你的帮助。

发送数据(MainActivity):

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

3 个答案:

答案 0 :(得分:0)

<强>更新

由于您的片段嵌入在xml中,因此您无法将值传递给片段类。为此你需要通过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");
        }

答案 1 :(得分:0)

在您的活动中,您使用的是.putInt(&#34;主题&#34; .....),但在片段中您调用.getParcelable(&#34; theme&#34;)。您已获得0,因为您尝试获取两种不同的数据类型。

答案 2 :(得分:0)

如果您在XML中嵌入了片段,则无法在程序中使用setArguments()。最好使用动态片段创建。

android开发者网站上有一个简短的例子可以指导你:http://developer.android.com/reference/android/app/Fragment.html当你有嵌入的片段以及如何使用它来处理参数时,还有另一个实现。

这里还有另一个资源可以帮到你:

Set arguments of fragment from activity