2015-12-03 21 views
6

Possiedo un FloatingActionButton all'interno del layout activity_main.xml di maggio denominato fabBtn.Nascondere un pulsante di azione mobile di un altro layout

La mia applicazione è costruito con una s.I ViewPager e tre Fragment desidera nascondere la FloatingActionButton quando il mio primo Fragment rileva una pergamena, ma continuo a ricevere un NullPointerException se l'utente inizia a scorrere.

Credo che potrebbe essere che il mio frammento non possa ottenere il FloatingActionButton dal layout activity_main.xml?

Ecco il mio 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> 

Qui è la mia prima Fragment da dove voglio nascondere il 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); 
} 
} 

Questo è il mio 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); 
} 
}    

risposta

19

First di tutti, modificare la linea di

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

a

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


Soluzione # 1 - ottenere la vista (se avete bisogno di un oggetto)

Poi, nel vostro MainActivity aggiungere getter per il tuo FloatingActionButton, come

public FloatingActionButton getFloatingActionButton { 
    return fabBtn; 
} 

Infine, nella vostra Fragment chiamata:

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

e

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

o

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


Soluzione # 2 - aggiungere due metodi in MainActivity (se avete bisogno solo metodi specifici, come show()/hide())

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

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

E nel tuo Fragment chiamata a nascondere:

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

o per mostrare :

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


Nota

Se si utilizza più di un Activity, è necessario verificare se è corretto Activity:

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

Grazie uomo ha funzionato! – Dolan

+0

non è la prima soluzione, ma la soluzione ha funzionato. –

+0

Mi piace la seconda soluzione .. lavorata come il bingo..grazie – Ujjwal

1

Nel vostro frammento il layout rootView non è il layout principale e non si può aspettare il rootView restituirà il pulsante fab.Ecco perché si stanno ottenendo un'eccezione di puntatore nullo

È meglio usare l'interfaccia per rilevare pagina scorrimento e controll tramite la vostra attività

Problemi correlati