2015-12-03 10 views
6

मेरे पास FloatingActionButton है activity_main.xml लेआउट के अंदर fabBtn नामित है।किसी अन्य लेआउट के फ़्लोटिंग एक्शन बटन को छिपाएं

मेरा आवेदन एक ViewPager और तीन Fragment s.I साथ बनाया गया है FloatingActionButton को छिपाने के लिए जब मेरी पहली Fragment एक स्क्रॉल का पता लगाता है चाहता हूँ, लेकिन मैं अगर उपयोगकर्ता स्क्रॉल शुरू होता है एक NullPointerException मिलती रहती है।

मुझे विश्वास है कि यह हो सकता है कि मेरा टुकड़ा activity_main.xml लेआउट से FloatingActionButton प्राप्त नहीं कर सकता है?

यहाँ मेरी 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> 

है यहाँ मेरा पहला Fragment से जहाँ मैं FloatingActionButton छुपाना चाहते है:

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); 
} 
}    

उत्तर

19

पहले:

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); 
} 
} 

यह मेरा MainActivity.class है के सभी, अपनी लाइन को बदलने

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

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


के समाधान # 1 - के लिए गेटर जोड़ने अपने MainActivity में दृश्य प्राप्त (यदि आप वस्तु की जरूरत है)

फिर, आपके FloatingActionButton, जैसे

public FloatingActionButton getFloatingActionButton { 
    return fabBtn; 
} 

अंत में, अपने Fragment कॉल में:

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

और

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

या

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


समाधान # 2 - (show()/hide() की तरह अगर आप केवल विशिष्ट विधियों की जरूरत है,) MainActivity में दो तरीकों जोड़ने

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

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

और अपने Fragment कॉल में छिपाने के लिए:

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

या दिखाने के लिए :

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


नोट

आप उपयोग करते हैं एक से अधिक Activity, आप Activity अगर यह उचित है की जांच करना चाहिए:

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

धन्यवाद मनुष्य यह काम करने के लिए

बेहतर होगा कि तुम आसान इंटरफ़ेस नल पॉइंटर एक्सेप्शन हो रही है! – Dolan

+0

पहला समाधान नहीं बल्कि समाधान काम किया। –

+0

मुझे दूसरा समाधान पसंद है .. बिंगो..थैंक की तरह काम किया – Ujjwal

1

अपने टुकड़ा में अपने rootView लेआउट नहीं मुख्य लेआउट है और आप rootView उम्मीद नहीं कर सकते फैब बटन वापस कर देगा।यही कारण है कि आप पृष्ठ स्क्रॉल का पता लगाने और अपनी गतिविधि के माध्यम से इसे नियंत्रित

संबंधित मुद्दे