Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Ocultar un botón de acción flotante de otro diseño

Tengo un FloatingActionButton dentro de la disposición del activity_main.xml que se llama fabBtn .

Mi aplicación está construida con un ViewPager y tres Fragment Quiero ocultar el FloatingActionButton cuando mi primer Fragment detecta un rollo, pero sigo obteniendo una NullPointerException si el usuario comienza a desplazarse.

Creo que podría ser que mi fragmento no puede obtener el FloatingActionButton del layout activity_main.xml ?

Aquí está mi activity_main.xml

  <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/rootLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="lh.com.newme.MainActivity" xmlns:fab="http://schemas.android.com/tools"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_scrollFlags="scroll|snap"/> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:tabMode="fixed" app:layout_scrollFlags="snap|enterAlways"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:background="#ffffff" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fabBtn" android:layout_marginBottom="@dimen/codelab_fab_margin_bottom" android:layout_marginRight="@dimen/codelab_fab_margin_right" android:layout_width="wrap_content" fab:fab_type="normal" android:layout_height="wrap_content" android:layout_gravity="bottom|right" app:backgroundTint="@color/fab_ripple_color" android:src="@drawable/ic_plus" app:fabSize="normal" /> </android.support.design.widget.CoordinatorLayout> 

Aquí está mi primer Fragment de donde quiero ocultar el FloatingActionButton :

  public class Ernaehrung extends Fragment { NestedScrollView nsv; FloatingActionButton fab; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); final View rootView = inflater.inflate(R.layout.ernaehrung, container, false); Button Fruehstuck = (Button) rootView.findViewById(R.id.fruehstuck); Button Mittagessen = (Button) rootView.findViewById(R.id.mittagessen); Button Snacks = (Button) rootView.findViewById(R.id.snacks); Fruehstuck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent FruehstuckScreen = new Intent(getActivity(), lh.com.newme.Fruehstuck.class); startActivity(FruehstuckScreen); } }); Mittagessen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent MittagScreen = new Intent(getActivity(), lh.com.newme.Mittagessen.class); startActivity(MittagScreen); } }); Snacks.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent SnackScreen = new Intent(getActivity(), lh.com.newme.Snacks.class); startActivity(SnackScreen); } }); nsv = (NestedScrollView)rootView.findViewById(R.id.Nsv); fab = (FloatingActionButton)rootView.findViewById(R.id.fabBtn); nsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (oldScrollY < scrollY){ fab.hide(); } else fab.show();} }); return rootView; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.main_menu_ernaehrung, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items int id = item.getItemId(); if (id == R.id.benutzer){ } return super.onOptionsItemSelected(item); } } 

Esta es mi MainActivity.class :

  public class MainActivity extends AppCompatActivity { FloatingActionButton fabBtn; CoordinatorLayout rootLayout; Toolbar toolbar; TabLayout tabLayout; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager())); viewPager.setOffscreenPageLimit(2); // Give the TabLayout the ViewPager final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.setupWithViewPager(viewPager); final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fabBtn); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position) { case 0: fab.show(); ... break; case 1: fab.show(); ... break; case 2: fab.hide(); break; default: fab.hide(); break; } } @Override public void onPageScrollStateChanged(int state) { } }); initInstances(); } private void initInstances() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); rootLayout = (CoordinatorLayout) findViewById(R.id.rootLayout); fabBtn = (FloatingActionButton) findViewById(R.id.fabBtn); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main_menu_edit, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.einstellungen) { return true; } return super.onOptionsItemSelected(item); } } 

  • RecyclerView no recicla vistas cuando lo usa dentro de NestedScrollView
  • Match_parent no funciona para ListView, si ListView está dentro de NestedScrollView
  • Fling suavemente AppBarLayout con NestedScrollView usando AppBarLayout.Behavior
  • Cómo puedo crear un diseño nestedScroll como este?
  • NestedScrollView se desplaza hacia abajo cuando el contenido se llena
  • ListView no se expande dentro de NestedScrollView
  • Cómo poner RecyclerView dentro de NestedScrollView?
  • Emita el desplazamiento WebView en NestedScrollView Android 2.3 o menos
  • 2 Solutions collect form web for “Ocultar un botón de acción flotante de otro diseño”

    En primer lugar, cambia tu línea

     final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fabBtn); 

    a

     fabBtn = (FloatingActionButton)findViewById(R.id.fabBtn); 

    Solución # 1 – obtener vista (si necesita objeto)

    A continuación, en su MainActivity agregue getter para su FloatingActionButton , como

     public FloatingActionButton getFloatingActionButton { return fabBtn; } 

    Finalmente, en su Fragment llame a:

     FloatingActionButton floatingActionButton = ((MainActivity) getActivity()).getFloatingActionButton(); 

    y

     if (floatingActionButton != null) { floatingActionButton.hide(); } 

    o

     if (floatingActionButton != null) { floatingActionButton.show(); } 

    Solución # 2 – agregue dos métodos en MainActivity (si necesita sólo métodos específicos, como show() / hide() )

     public void showFloatingActionButton() { fabBtn.show(); }; public void hideFloatingActionButton() { fabBtn.hide(); }; 

    Y en su Fragment llame a esconder:

     ((MainActivity) getActivity()).hideFloatingActionButton(); 

    O para mostrar:

     ((MainActivity) getActivity()).showFloatingActionButton(); 

    Nota

    Si utiliza más de una Activity , debe comprobar si es Activity apropiada:

     if (getActivity() instanceof MainActivity) { getActivity().yourMethod(); // your method here } 

    En su fragmento, su diseño rootView no es el diseño principal y no puede esperar que el rootView devuelva el botón fab. Ése es porqué usted está consiguiendo la excepción del puntero nulo

    Es mejor utilizar la interfaz para detectar el desplazamiento de la página y controlarlo a través de su actividad

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.