viewpager studio practice fragments example best android android-viewpager fragmentmanager

android - studio - Cierre de la aplicación en viewPager.setAdapter(adaptador)



view pager adapter android studio (2)

Tengo una página de aplicación con viewpager que contiene dos fragmentos. Cuando aparece mi actividad, se realiza una solicitud del servidor para cargar datos actuales y luego se configura el adaptador. Pero la aplicación se bloquea con el siguiente error.

Intento de invocar el método virtual ''void android.support.v4.app.Fragment.setMenuVisibility (boolean)'' en una referencia de objeto nulo

Durante la depuración, viewPager.setAdapter (adaptador) mostró una excepción de puntero nulo. Ni mi viewPager es nulo ni mi adaptador.

No puedo descifrar por qué sucede esto.

¡¡Por favor ayuda!! ¡¡Gracias por adelantado!!


Prueba este código

crear un archivo de clase TabOne.java

package com.example.tabfragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TabOne extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tab_one, null); return rootView; } }

crea un archivo de clase TabTwo.java

package com.example.tabfragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TabTwo extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tab_two, null); return rootView; } }

** crear el archivo xml tab_one.xml y tab_two.xml **

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="@string/tab_2" /> </RelativeLayout>

Crea una clase TabFragmentPageAdapter.java

package com.example.tabfragment; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class TabFragmentPageAdapter extends FragmentPagerAdapter { private Bundle args; private List<Fragment> fragments; public TabFragmentPageAdapter(FragmentManager fm, List<Fragment> fragments, Bundle args) { super(fm); this.fragments = fragments; this.args = args; } @Override public Fragment getItem(int position) { Fragment fragment = fragments.get(position); fragment.setArguments(args); return fragment; } @Override public int getCount() { return fragments.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }

Crear un archivo de clases TabFragments.java

public class TabFragments extends Fragment implements OnPageChangeListener, OnTabChangeListener { public static final int TAB_LOGIN = 0; public static final int TAB_REG = 1; private TabHost tabHost; private int currentTab = TAB_LOGIN; private ViewPager viewPager; private TabFragmentPageAdapter pageAdapter; private List<Fragment> fragments; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_home, null); tabHost = (TabHost) rootView.findViewById(android.R.id.tabhost); viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); viewPager.setOnPageChangeListener(this); fragments = new ArrayList<Fragment>(); fragments.add(new TabOne()); fragments.add(new TabTwo()); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setRetainInstance(true); pageAdapter = new TabFragmentPageAdapter(getChildFragmentManager(), fragments, getArguments()); pageAdapter.notifyDataSetChanged(); viewPager.setAdapter(pageAdapter); setupTabs(); } private void setupTabs() { tabHost.setup(); tabHost.addTab(newTab(R.string.tab_1)); tabHost.addTab(newTab(R.string.tab_2)); for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) { tabHost.getTabWidget().getChildAt(i) .setBackgroundColor(Color.parseColor("#304c58")); // tabHost.setBackgroundResource(R.drawable.tab_selector); final View view = tabHost.getTabWidget().getChildTabViewAt(i); final View textView = view.findViewById(android.R.id.title); ((TextView) textView).setTextColor(Color.parseColor("#e2ebf0")); ((TextView) textView).setSingleLine(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { tabHost.getTabWidget().getChildAt(i) .findViewById(android.R.id.icon); tabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 75; } else { if (view != null) { // reduce height of the tab view.getLayoutParams().height *= 0.77; if (textView instanceof TextView) { ((TextView) textView).setGravity(Gravity.CENTER); textView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; } } } } tabHost.setOnTabChangedListener(TabFragments.this); tabHost.setCurrentTab(currentTab); } private TabSpec newTab(int titleId) { TabSpec tabSpec = tabHost.newTabSpec(getString(titleId)); tabSpec.setIndicator(getString(titleId)); tabSpec.setContent(new TabFactory(getActivity())); return tabSpec; } @Override public void onPageScrollStateChanged(int position) { } @Override public void onPageScrolled(int position, float arg1, int arg2) { } @Override public void onPageSelected(int position) { tabHost.setCurrentTab(position); } @Override public void onTabChanged(String tabId) { currentTab = tabHost.getCurrentTab(); viewPager.setCurrentItem(currentTab); updateTab(); } @SuppressWarnings("unused") private void updateTab() { switch (currentTab) { case TAB_LOGIN: TabOne login = (TabOne) fragments.get(currentTab); break; case TAB_REG: TabTwo register = (TabTwo) fragments .get(currentTab); break; } } class TabFactory implements TabContentFactory { private final Context context; public TabFactory(Context context) { this.context = context; } @Override public View createTabContent(String tag) { View v = new View(context); v.setMinimumHeight(0); v.setMinimumWidth(0); return v; } } }

Crea tu clase de actividad

import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBarActivity; import android.util.Log; public class MainActivity extends ActionBarActivity { Fragment fragment = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragment = new TabFragments(); Log.i("fragment", "" + fragment.getId()); if (fragment != null) { FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction().replace(R.id.frame_container, fragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); } } }

Crear archivo mainactivity.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.DrawerLayout>

crear archivo tab fragment_home.xml

<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ts="http://schemas.android.com/apk/res-auto" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:fadingEdge="none" android:background="#394c58" android:tabStripEnabled="false" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout> </TabHost>


Encontré el problema .. En mi fragmentPagerAdapter, getItem () devolvía null para un fragmento.