AND*_*849 19 java android fragmenttransaction navigation-drawer
我遇到了导航抽屉的问题,它太慢了,我正在寻找的解决方案是首先关闭抽屉然后显示活动,但它不起作用,当然我错过了一些东西.
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int posicao, long id) {
setLastPosition(posicao);
setFragmentList(lastPosition);
layoutDrawer.closeDrawer(linearDrawer);
}
}
private OnClickListener userOnClick = new OnClickListener() {
@Override
public void onClick(View v) {
layoutDrawer.closeDrawer(linearDrawer);
}
};
private void setFragmentList(int posicao) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = new FragmentViagens();
switch (posicao) {
case 0:
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
break;
case 1:
fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentPedidos()).commit();
break;
case 2:
fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentClientes()).commit();
break;
}
navigationAdapter.setChecked(posicao, true);
setTitleFragments(lastPosition);
navigationAdapter.resetarCheck();
layoutDrawer.closeDrawer(linearDrawer);
}
Run Code Online (Sandbox Code Playgroud)
Yur*_*raj 37
您可以这样做以避免抽屉滞后,更改您的onItemClick:
layoutDrawer.closeDrawer(linearDrawer);
setLastPosition(posicao);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setFragmentList(lastPosition);
}
}, 200);
Run Code Online (Sandbox Code Playgroud)
编辑:首选方式应该是在DrawerLayout上设置DrawerListener并onDrawerClosed
像这样设置你的片段:
Fragment mFragmentToSet = null;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// Handle navigation view item clicks here.
switch (item.getItemId()) {
case R.id.nav_home:
mFragmentToSet = HomeFragment.newInstance();
break;
}
mDrawerLayout.closeDrawer(GravityCompat.START);
return true;
}
Run Code Online (Sandbox Code Playgroud)
mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override public void onDrawerSlide(View drawerView, float slideOffset) {}
@Override public void onDrawerOpened(View drawerView) {}
@Override public void onDrawerStateChanged(int newState) {}
@Override
public void onDrawerClosed(View drawerView) {
//Set your new fragment here
if (mFragmentToSet != null) {
getSupportFragmentManager()
.beginTransaction()
.replace(FRAGMENT_CONTAINER_ID, mFragmentToSet)
.commit();
mFragmentToSet = null;
}
}
});
Run Code Online (Sandbox Code Playgroud)
我想我找到了最好的解决方案!
首先像你这样做你的片段交易:
new Handler().post(new Runnable() {
@Override
public void run() {
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.container, finalMenuFragment)
.commit();
}
});
Run Code Online (Sandbox Code Playgroud)
我知道发布Runnable看起来没什么用处,但是这个hack避免了抽屉上点击动画的延迟,特别是当你使用
android:background="?attr/selectableItemBackground"可点击的元素时.
然后你关闭你的片段的onResume()函数的抽屉(在这个例子中它是"finalMenuFragment"),如下所示:
new Handler().post(new Runnable() {
public void run() {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
});
Run Code Online (Sandbox Code Playgroud)
再次,我知道发布Runnable似乎很愚蠢,但它使得近距离动画变得平滑.
这样,如果您想要平滑的动画,抽屉将尽可能快地关闭,如果您的片段中没有很多视图,它将更快地关闭并且仍然没有滞后.
如果有人测试了这个解决方案,我希望得到一些反馈,希望它有所帮助!
小智 5
我只用One-Line解决了这个问题
转到你的Menifest文件在你的抽屉活动刚刚把HardwareAccelerated设置为true以防止打开抽屉的滞后
<activity
android:name=".activity.YourDrawerActivity"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait"
android:hardwareAccelerated="true" //important
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26321 次 |
| 最近记录: |