Java 隐藏另一布局的浮动操作按钮
我有一个Java 隐藏另一布局的浮动操作按钮,java,android,floating-action-button,nestedscrollview,Java,Android,Floating Action Button,Nestedscrollview,我有一个FloatingActionButton在五月activity\u main.xmllayout,名为fabBtn 我的应用程序是用一个ViewPager和三个Fragment构建的。当我的第一个Fragment检测到滚动时,我想隐藏FloatingActionButton,但如果用户开始滚动,我会一直得到一个NullPointerException 我相信这可能是因为我的片段无法从activity\u main.xml布局中获取FloatingActionButton 这是我的活动\u
FloatingActionButton
在五月activity\u main.xml
layout,名为fabBtn
我的应用程序是用一个ViewPager
和三个Fragment
构建的。当我的第一个Fragment
检测到滚动时,我想隐藏FloatingActionButton
,但如果用户开始滚动,我会一直得到一个NullPointerException
我相信这可能是因为我的片段无法从activity\u main.xml
布局中获取FloatingActionButton
这是我的活动\u 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>
这是我的main活动。类:
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);
}
}
首先,更改您的线路
final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fabBtn);
到
解决方案#1-获取视图(如果需要对象)
然后,在main活动中为floatingAction按钮添加getter,如
public FloatingActionButton getFloatingActionButton {
return fabBtn;
}
最后,在片段中
调用:
FloatingActionButton floatingActionButton = ((MainActivity) getActivity()).getFloatingActionButton();
及
或
解决方案#2-在MainActivity
中添加两个方法(如果您只需要特定的方法,如show()
/hide()
)
在片段中
调用隐藏:
((MainActivity) getActivity()).hideFloatingActionButton();
或显示:
((MainActivity) getActivity()).showFloatingActionButton();
注意
final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fabBtn);
如果您使用了多个活动
,则必须检查它是否正确活动
:
if (getActivity() instanceof MainActivity) {
getActivity().yourMethod(); // your method here
}
在片段中,您的rootView布局不是主布局,您不能期望rootView返回fab按钮。这就是为什么会出现空指针异常
您最好使用界面来检测页面滚动,并通过活动来控制它
public void showFloatingActionButton() {
fabBtn.show();
};
public void hideFloatingActionButton() {
fabBtn.hide();
};
((MainActivity) getActivity()).hideFloatingActionButton();
((MainActivity) getActivity()).showFloatingActionButton();
if (getActivity() instanceof MainActivity) {
getActivity().yourMethod(); // your method here
}