2016-04-02 16 views
2

私はパーセル可能に新しく、アクティビティ(MainActivity)からフラグメント(MainFragment)にデータを渡そうとしていますが、この権利を得るには苦労しています。アクティビティからフラグメントへのパーセル

すべての(パーセル可能な)データを含むクラス(InfoBean)を作成しました。私はMainActivityからデータを送信するすると、bean.newTheme()からのデータがありますが、すぐに私は断片で取得しようとして、値がです!

誰かが見ているかもしれませんが、私は間違っていますか?ご協力ありがとうございました。

送信データ(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]; 
     } 
    }; 
} 
+0

は、XMLに埋め込まれたあなたのフラグメントであるか、それを動的に作成していますか? – Pooya

+0

@Pooya xmlに埋め込まれています – Simon

+0

xmlに埋め込まれた値を渡すことはできません。 duh –

答えて

0

XMLにフラグメントが埋め込まれている場合は、プログラム内でそのようなsetArguments()を使用することはできません。動的なフラグメント作成を使用する方が良いです。

あなたを導くことができるアンドロイドデベロッパーウェブサイトの簡単な例があります:http://developer.android.com/reference/android/app/Fragment.htmlフラグメントを埋め込んでいるときに別の実装があり、それを使って引数を処理する方法もあります。

あなたを助けることがあり、ここで別のリソースもあります:

Set arguments of fragment from activity

+0

ええとthx。私は今気づいた 愚か。 – Simon

0

更新

あなたのフラグメントはxmlに埋め込まれているので、フラグメントクラスに値を渡すことはできません。そのためには、javaコードを使ってexcuteし、そのxmlを削除する必要があります。それはあなたがフラグメントののonCreateメソッドで値を取得しようとする必要があり

更新

を動作するフラグメントのトランザクションを作成します。

@overide 
protect void onCreate(bundle onSavedInstance){ 
    if (savedInstance != null) { 
    bean.newTheme = bundle.getInt("theme"); 
    } 
} 

あなたは.putInt( "テーマ" を.....)を使用していますが、呼び出しの断片にされ、代わりにあなたの活動に

if (bundle != null) { 
     bean.newTheme = bundle.getParcelable("theme"); 
     } 
+0

です。私がそれをするなら、価値はまだ0です。 bean.newTheme = bundle.getInt( "theme"); – Simon

+0

これはうまくいくはずです。私は他の欠陥を見ません。 –

+0

奇妙なバンドルバンドル= this.getArguments();だからそこには何もない。 私は間違いを見ません。 – Simon

0

のこの

if (bundle != null) { 
     bean.newTheme = bundle.getInt("theme"); 
     } 

をお試しください.getParcelable( "テーマ")。 2つの異なるデータ型を取得しようとしているため、0になっています。

+0

答えのためのthx。私が 'getInt'に値を0に変えれば。 コードが編集されました。 – Simon

関連する問題