Configuración de RadioButton.setChecked con varios fragmentos

Hey tengo un problema realmente estúpido y no puedo entender por qué no está funcionando como se esperaba. Así que tengo un diseño de MultiFragment (cada uno tiene algunas preguntas diferentes) usando viewpager y FragmentStatePagerAdapter. Cuando abro la pantalla que aloja todos estos fragmentos estoy intentando restaurar el estado anterior (marcar todas las preguntas contestadas) usando una llamada de red. Sin embargo, parece que si mi Fragmento no es visible para el usuario, no puede actualizar el estado marcado del botón de opción / casillas de verificación.

Introduzca aquí la descripción de la imagen

¿Alguien sabe lo que puedo hacer para lograr el comportamiento deseado?

Saludos y gracias de antemano!

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); presenter.restoreAnswersFromPreviousSession(questionId); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisible()) { if (isVisibleToUser) { presenter.restoreAnswersFromPreviousSession(questionId); Log.d("Fit", "My Fragment is visible"); } else { Log.d("Fit", "My Fragment is not visible"); } } } 

Aquí restauro el estado (llamado después de que la solicitud sea correcta)

 previousReplies = repliesToRestore; for (QualityReportReply reportReply : repliesToRestore) { int id = reportReply.id(); switch (id) { case 201: { boolean tooThin = (boolean) reportReply.value(); if (tooThin) { materialTooThinGroupYes.setChecked(true); } else { materialTooThinGroupNo.setChecked(true); } break; } case 202: { boolean tooThick = (boolean) reportReply.value(); if (tooThick) { materialTooThickGroupYes.setChecked(true); } else { materialTooThickGroupNo.setChecked(true); } break; } case 203: { boolean drawingThreads = (boolean) reportReply.value(); if (drawingThreads) { materialDrawThreadsGroupYes.setChecked(true); } else { materialDrawThreadsGroupNo.setChecked(true); } break; } case 204: { boolean flyingThreads = (boolean) reportReply.value(); if (flyingThreads) { materialFlyingThreadsGroupYes.setChecked(true); } else { materialFlyingThreadsGroupNo.setChecked(true); } break; } case 205: { boolean knots = (boolean) reportReply.value(); if (knots) { materialKnotsGroupYes.setChecked(true); } else { materialKnotsGroupNo.setChecked(true); } break; } 

7 Solutions collect form web for “Configuración de RadioButton.setChecked con varios fragmentos”

ACTUALIZAR

Aquí está un ejemplo de trabajo, usted puede verlo.

Creo que usted está restaurando el estado en la Activity anfitrión. No lo hagas, hazlo en cada Fragment . Digamos que tienes dos fragmentos, Passform y Material , así que en lugar de hacerlo en Activity , haz una llamada dentro de onCreateView del fragmento.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_passform, container, false); new FetchPassFormState().execute(); return view; } 

Actualizar views dentro de onPostExecute de FetchPassFormState o donde quiera, según su necesidad.

ACTUALIZAR

Puedes hacer una cosa. Debes agregar Fragments en tu QuestionsViewPagerAdapter , intenta setArguments de tus Fragments allí. Me gusta,

 Fragment fragment = new YourFragment(); Bundle bundle = new Bundle(); bundle.putString("your_key", "Your Data"); ... fragment.setArguments(bundle); 

Ahora agregue este fragment . Y dentro de Fragment 's onCreateView , obtenga este Bundle .

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_material_questions, container, false); ButterKnife.bind(this, view); getFragmentComponent().inject(this); presenter.setView(this); Bundle bundle = getArguments(); String youdData = bundle.getString("your_key"); ... } 

A continuación, utilice estos datos para establecer vistas.

Necesitas usar setOffscreenPageLimit

 viewPager.setOffscreenPageLimit(<total_page_count>); 

Como dicen los documentos

Establezca el número de páginas que deben conservarse en cualquier lado de la página actual en la jerarquía de vistas en un estado inactivo. Las páginas más allá de este límite se recrearán desde el adaptador cuando sea necesario.

Creo que uno de los problemas que tienes es hacer la restauración en onCreateView.

Esta es la forma de actualizar mis fragmentos llamando a webservices cuando el fragmento se vuelve visible.

CallToRestore () dispara una llamada de servicio web asíncrona (usando ion) después de lo cual recibo una devolución de llamada que rellena la información de mi fragmento.

 protected boolean restoreOnHold = false; @Override public void onResume() { super.onResume(); if(restoreOnHold ){ restoreOnHold = false; callToRestore(); } } @Override public void setUserVisibleHint(boolean isVisible){ super.setUserVisibleHint(isVisible); if (isVisible) { if(getView() != null){ restoreOnHold = false; callToRestore(); }else{ restoreOnHold = true; } } } 

Puesto que tus fragmentos (que son VIEWS!) Manejan datos, tienes problemas para actualizarlos en el momento adecuado. Espero que esto da ua buen comienzo para más codificación 🙂

** editar: quiero señalar mi comentario sobre putAllAnswersFromPreviousSessions (DataObject mObject)

  public class QuestionPagerAdapter extends FragmentStatePagerAdapter { private List<Fragment> mFragments; private Bundle mData = null; public QuestionPagerAdapter(FragmentManager fm) { super(fm); // u can add and remove fragments anytime during runtime with this List<Fragments> mFragments = new ArrayList<>(); } /** * Everytime we show a new position, set your Bundle to your Fragments. * @param position * @return fragment with data; */ @Override public Fragment getItem(int position) { // Note, that the method .setArguments(Bundle bundle) should only be called, // before the Fragments are attached. Therefore, we need to // @Override getItemPosition(Obj) to ensure, that your Fragments are redrawn, when selected; mFragments.get(position).setArguments(mData); return mFragments.get(position); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public int getCount() { return mFragments.size(); } /** * Invoke this Method from your activity, when u get your data from the internet; * You could register an receiver inside your activity and when u get an result from your AsyncTask, * u could call * mQuestionPagerAdapter.putAllAnswersFromPreviousSessions(result); * mQuestionPagerAdapter.notifyDataSetChanged(); * @param mObject a simple data object. */ public void putAllAnswersFromPreviousSessions(DataObject mObject){ Bundle dataObject = new Bundle(); boolean[] mReceivedData = mObject.getAllAnswers(); for (int i = 0; i < mReceivedData.length; i++){ dataObject.putBoolean("answer_"+String.valueOf(i), mReceivedData[i]); } this.mData = dataObject; } } 

Si cuida que sus datos se carguen antes de mostrar sus fragmentos, no invoque mQuestionPagerAdapter.notifyDataSetChanged (). Este método obliga a FragmentStatePagerAdapter a redibujar sus fragmentos y la posición de la pantalla se perderá (el mismo fragmento se mostrará sin embargo :-))

Otro truco aseado que aprendí es recuperar sus datos en cualquier momento de su FragmentStatePagerAdapter:

  @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mViewPager = (ViewPager) getActivity().findViewById(R.id.view_pager); mStatePagerAdapter = (FragmentStatePagerAdapter) mViewPager.getAdapter(); } 

Con ambos enfoques, debe ser capaz de almacenar sus datos fuera de sus puntos de vista (sus fragmentos) y obtener / establecer, cuando u necesidad.

 public class DataObject { private boolean[] mAnswersFromPreviousSessions; /** * This data-object is a suggestion. * Since u need to decide between three states (true / false / empty), * u should work with enums eg * @param answers your data.. */ public DataObject(boolean[] answers) { super(); this.mAnswersFromPreviousSessions = answers; } /** get all answers, or **/ public boolean[] getAllAnswers() { return mAnswersFromPreviousSessions; } /** just ask for a specific one **/ public boolean getAnswerFor(int questionPosition){ return mAnswersFromPreviousSessions[questionPosition]; } } 

Gruß

** Edición siguiente: no sé porqué consigo downvoted inmediatamente, pero mi acercamiento coincide sus requisitos. Obtiene sus datos en setArguments (), incluso antes de que su Fragmento se cree. Por lo tanto, incluso puede aplicarlo en OnCreateView (). Por favor comente @ downvote.

Tengo el mismo problema con mi aplicación de prueba. Y he encontrado una cosa, que el sistema android no está actualizando la interfaz de usuario cuando el radioButton.setChecked(true); Función se llama. Pero se refleja internamente en el código (cuando lo comprueba – comprobado o no).

Para resolver este problema, tiene que utilizar la llamada de función siguiente del widget RadioButton.

 radioButton.setSelectedState(true); //This makes the ui selected. use false to make the ui not selected. 

Aquí como para su código usted tiene que cambiar su función a

 previousReplies = repliesToRestore; for (QualityReportReply reportReply : repliesToRestore) { int id = reportReply.id(); switch (id) { case 201: { boolean tooThin = (boolean) reportReply.value(); if (tooThin) { materialTooThinGroupYes.setChecked(true); //Keep it if you want to get the values from the code materialTooThinGroupYes.setSelectedState(true); //To Change the UI } else { materialTooThinGroupNo.setChecked(true); materialTooThinGroupNo.setSelectedState(true); //To Change the UI } break; } case 202: { boolean tooThick = (boolean) reportReply.value(); if (tooThick) { materialTooThickGroupYes.setChecked(true); materialTooThickGroupYes.setSelectedState(true); //To Change the UI } else { materialTooThickGroupNo.setChecked(true); materialTooThickGroupNo.setSelectedState(true); //To Change the UI } break; } case 203: { boolean drawingThreads = (boolean) reportReply.value(); if (drawingThreads) { materialDrawThreadsGroupYes.setChecked(true); materialDrawThreadsGroupYes.setSelectedState(true); //To Change the UI } else { materialDrawThreadsGroupNo.setChecked(true); materialDrawThreadsGroupNo.setSelectedState(true); //To Change the UI } break; } case 204: { boolean flyingThreads = (boolean) reportReply.value(); if (flyingThreads) { materialFlyingThreadsGroupYes.setChecked(true); materialFlyingThreadsGroupYes.setSelectedState(true); //To Change the UI } else { materialFlyingThreadsGroupNo.setChecked(true); materialFlyingThreadsGroupNo.setSelectedState(true); //To Change the UI } break; } case 205: { boolean knots = (boolean) reportReply.value(); if (knots) { materialKnotsGroupYes.setChecked(true); materialKnotsGroupYes.setSelectedState(true); //To Change the UI } else { materialKnotsGroupNo.setChecked(true); materialKnotsGroupNO.setSelectedState(true); //To Change the UI } break; } 

Intente guardar las respuestas en una clase de modelo después de una llamada de red mientras recibe el fragmento principal y luego use esa clase de modelo en cada fragmento para llenar los detalles.

En primer lugar, cuando se crea una actividad, siga estos pasos. 1. Llamada de red para todos los datos. 2. En el resultado exitoso, separar los datos para diferentes fragmentos. En su caso 4 fragmentos supongo. 3. configurar ver paginador y agregar fragmentos. 4. Envíe los datos respectivos a los fragmentos usando fragment.setArguments (paquete) y obtenga los datos usando getArguments. 5. Establezca el resultado en su botón de opción / casillas de verificación en onCreateView de su fragmento.

Actividad onCreate:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // load the layout setContentView(R.layout.activity_layout); // Your network call presenter.restoreAnswersFromPreviousSession(questionId); } @Override public void onSuccess(Object result){ // setup view your view pager and fragments here. // add restored replies to fragments. Fragment fragment = new FragmentOne(); Bundle bundle = new Bundle(); bundle.putExtra("restored_replies", replies); fragment.setArguments(bundle); } 

Y obtenga sus respuestas restauradas en onCreateView para cada fragmento. Establezca las casillas de verificación / botones de radio según los datos recibidos.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_questions, container, false); ... Bundle bundle = getArguments(); Object data = bundle.getSerializableExtra("restored_replies"); // Serialize object before passing as an argument. // set you check boxes and radio buttons according to the data received. ... return view; } 

Resumen: Hacer llamada de red en la actividad y enviar el resultado a los fragmentos respectivos para mostrar.

  • Obtener la matriz de RadioButtons en un RadioGroup en Android
  • ¿Posible que todos los botones de radio no estén marcados en una aplicación para Android?
  • RadioGroup checkedButton propiedad
  • RadioButtons con TextView en RadioGroup
  • Android - Botón de radio - el botón dibujable no se muestra en Lollipop
  • Android ListView con RadioButton en modo singleChoice y un diseño de fila personalizado
  • Diseño personalizado para RadioButton
  • RadioGroup extendiendo RelativeLayout?
  • Android RadioButton como Comportamiento
  • Administrar el diseño dentro de un radiogrupo horizontal orientado
  • Preparación del tipo de grupo de radio personalizado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.