2016-04-02 3 views
2

Я новичок в разбирательстве, и я пытаюсь передать данные из Activity (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(), как в вашей программе. Лучше использовать создание динамического фрагмента.

На веб-сайте разработчика Android есть краткий пример, который может помочь вам: http://developer.android.com/reference/android/app/Fragment.html есть еще одна реализация, когда у вас есть встроенные фрагменты и как обрабатывать аргументы с этим.

Существует также еще один ресурс, который здесь может помочь вам:

Set arguments of fragment from activity

+0

yeah thx. Я заметил прямо сейчас. Глупо. – Simon

0

Update

Поскольку у вас есть фрагмент, встроенный в xml, вы не можете передавать значения в класс фрагмента. Для этого вам нужно сделать это через java-код и удалить этот xml. Сделать фрагмент Сделку тогда он будет работать

Update

Вы должны попробовать извлечения значений в методе 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"); 
     } 
+0

THX для ответа. Если я это сделаю, значение будет равно 0. bean.newTheme = bundle.getInt ("theme"); – Simon

+0

это должно работать. я не вижу никакой другой неисправности. –

+0

Weird, Bundle bundle = this.getArguments(); дает 0. Так что ничего нет. Я не вижу ошибки. – Simon

0

В вашей деятельности, вы используете .putInt ("тема" .....), но во фрагменте вы называете .getParcelable ("тема"). Вы получаете 0, потому что пытаетесь получить два разных типа данных.

+0

thx для ответа. Если я изменю это на значение 'getInt', то до 0. Код отредактирован – Simon

Смежные вопросы