2015-12-03 2 views
6

У меня есть FloatingActionButton внутри майского activity_main.xml макет, который называется fabBtn.Скрыть плавающую кнопку действия другого макета

Мое приложение построено с ViewPager и три Fragment s.I хотите скрыть FloatingActionButton когда мой первый Fragment обнаруживает свиток, но я продолжаю получать NullPointerException, если пользователь начнет прокручиваться.

Я считаю, что мой фрагмент не может получить FloatingActionButton с макета activity_main.xml?

Вот мой 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 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:

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

Первый из всех, изменить вашу линию

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 - добавить два метода в MainActivity (если вам нужны только определенные методы, такие как show()/hide())

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

Мне нравится второе решение ... работало как bingo..thanks – Ujjwal

1

В вашем фрагменте макет rootView не является основной макет, и вы не можете ожидать rootView вернет кнопку fab.Вот почему вы получаете нулевой указатель исключения

вам лучше использовать интерфейс для обнаружения прокрутки страниц и проверочной его с помощью вашей деятельности