Botón de un fragmento dentro de ViewPager activar onClickListener en referencia incorrecta
Lo siento por mi título estúpido, lo describiré claramente a continuación:
Situación
- ViewPager + Adaptador en Fragmento => laggy swiping
- Actualización dinámica de TabLayout sin cambiar la ficha seleccionada
- Fragmento en ViewPager utilizando FragmentPagerAdapter está en blanco la segunda vez que se ve
- Los datos de ViewPager se pierden al volver de la siguiente pantalla
- Problema de renderización de ViewPager personalizado en ciertos dispositivos:
Tengo un ViewPager
con 4 OnBoardingFragment
s adentro. Cada Fragment
tiene exactamente el mismo diseño que se inflated
desde el mismo archivo xml. Este diseño contiene un Button
que llamé btnNext
y configuré OnClickListener
para ello.
Función getItem
de mi PagerAdapter
@Override public Fragment getItem(int position) { String title, description, button; int resource; boolean end = false; switch (position) { case 0: title = context.getString(R.string.on_boarding_title_1); description = context.getString(R.string.on_boarding_description_1); resource = R.drawable.on_boarding_bg_0; button = context.getString(R.string.on_boarding_button_1); break; case 1: title = context.getString(R.string.on_boarding_title_2); description = context.getString(R.string.on_boarding_description_2); resource = R.drawable.on_boarding_bg_1; button = context.getString(R.string.on_boarding_button_2); break; case 2: title = context.getString(R.string.on_boarding_title_3); description = context.getString(R.string.on_boarding_description_3); resource = R.drawable.on_boarding_bg_2; button = context.getString(R.string.on_boarding_button_3); break; default: title = context.getString(R.string.on_boarding_title_4); description = context.getString(R.string.on_boarding_description_4); resource = R.drawable.on_boarding_bg_3; button = context.getString(R.string.on_boarding_button_4); end = true; } return OnBoardingFragment.newInstance(title, description, resource, button, end); } @Override public int getCount() { return 4; }
Funciones de OnBoardingFragment
:
public static OnBoardingFragment newInstance(String title, String description, int resource, String button, boolean end) { Bundle bundle = new Bundle(); bundle.putString(EXTRA_TITLE, title); bundle.putString(EXTRA_DESCRIPTION, description); bundle.putInt(EXTRA_IMAGE, resource); bundle.putString(EXTRA_BUTTON, button); bundle.putBoolean(EXTRA_END, end); OnBoardingFragment fragment = new OnBoardingFragment(); fragment.setArguments(bundle); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); if (bundle != null) { title = bundle.getString(EXTRA_TITLE); description = bundle.getString(EXTRA_DESCRIPTION); button = bundle.getString(EXTRA_BUTTON); end = bundle.getBoolean(EXTRA_END); imageResource = bundle.getInt(EXTRA_IMAGE); show log ---> Log.e(this.toString() + "/" + end + "/" + title); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.on_boarding_fragment, container, false); TextView tvTitle = (TextView) rootView.findViewById(R.id.tv_title); TextView tvDescription = (TextView) rootView.findViewById(R.id.tv_description); TextView btnDiscovery = (TextView) rootView.findViewById(R.id.tv_discovery); imageView = (ImageView) rootView.findViewById(R.id.iv_image); final Button btnNext = (Button) rootView.findViewById(R.id.btn_next); if (end) { btnDiscovery.setVisibility(View.VISIBLE); btnDiscovery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startRegionActivity(); } }); } btnNext.setText(button); btnNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { show log ---> Log.e(OnBoardingFragment.this.toString() + "/" + end + "/" + title + "/" + ((Button)v).getText()); if (end) { ((SplashActivity) getActivity()).gotoNextPage(); } else { startLoginActivity(); } } }); tvTitle.setText(title); tvDescription.setText(description); ImageUtils.loadBitmap(getActivity(), imageResource, imageView, 0.8f, new ImageUtils.LoadBitmapCallback() { @Override public void onLoadComplete(ImageView imageView) { } @Override public void onLoadFail() { } }); return rootView; }
El problema es
Cuando mi aplicación comenzó mostró el primer Fragment
, luego presioné el método Button
y trigger onItemClick()
y el método se hizo referencia al último Fragment
.
Registro cuando crea Fragment
OnBoardingFragment{a8ede47 id=0x7f10013b}/false/XIN CHÀO! OnBoardingFragment{8787674 #0 id=0x7f10013b}/false/BÁN LIỀN TAY, KIẾM TIỀN NGAY OnBoardingFragment{119f79d #1 id=0x7f10013b}/false/CHAT MIỄN PHÍ OnBoardingFragment{1ee7412 #2 id=0x7f10013b}/true/NGƯỜI THẬT, HÀNG THẬT
Registro cuando se onClickListener()
OnBoardingFragment{1ee7412 #2 id=0x7f10013b}/true/NGƯỜI THẬT, HÀNG THẬT/Đi chợ ngay nào!
Registro cuando el btnNext
se inicializó:
button: android.support.v7.widget.AppCompatButton{17c69e97 VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next} button: android.support.v7.widget.AppCompatButton{31941c VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next} button: android.support.v7.widget.AppCompatButton{30765b87 VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next} button: android.support.v7.widget.AppCompatButton{9cf19e VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next}
Pregunta
¿Por qué sucede y cómo resolver?
- Destruye las páginas de ViewPager y FragmentStatePagerAdapter
- Android ViewPager con iconos
- ¿Es posible acceder al Fragmento actual que está siendo visualizado por un ViewPager?
- NullPointerException al mostrar un ViewPager una segunda vez
- Establecer la altura de Viewpager dentro de Scrollview en android
- Visualización de varias páginas en ViewPager, posición incorrecta
- ViewPager dentro de la fila ListView impide que onItemClick sea despedido
- Agregando Viewpager como un encabezado a un listView
Por favor remítase a la muestra en el siguiente enlace para usar ver paginador con múltiples fragmentos: https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter
Cuando el usuario hace clic en el botón, envíe ese evento de nuevo a la actividad (o donde tenga una referencia del viewpager). A partir de ahí, debe comprobar qué fragmento en el viewpager está visible (consulte Determinar cuando un ViewPager cambia las páginas y Cómo determinar cuándo Fragmento se vuelve visible en ViewPager ) y entonces sabrá qué hacer con ese evento.
Puede utilizar una interfaz de escucha para obtener el fragmento y crear un método para obtener la posición y enviarlo en donde se ha declarar el viewpager por 1. Primero crear un objeto anónimo de esa interfaz en ese fragmento 2. En segundo lugar pasar ese objeto a PagerAdapter 3. En tercer lugar, puede utilizar ese objeto en el PagerAdapter y llamar al método que se utiliza en la interfaz con la posición de fragmento 4. puede incluir el código de manipulación de diseño de fragmento en el método dentro de la clase interna anónima de esa interfaz
Por favor, pruebe esto, va a funcionar. Espero que puedas entender lo que he dicho.
case 3:
uso case 3:
con una break
al final y en default
, solo pon un solo break
y ninguna otra declaración.
Add break statement en bloque por defecto y también pasar argumento end = false en el caso 0,1,2
- Bibliotecas puras de codificación / decodificación de vídeo java
- Redireccionar el tráfico de Google Talk para Android