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);
}
引き出しの遅れを避けるためにこの方法で行うことができます、あなたのonItemClickを変更します:
layoutDrawer.closeDrawer(linearDrawer);
setLastPosition(posicao);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setFragmentList(lastPosition);
}
}, 200);
Edit: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;
}
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;
}
}
});
OnClickでトランザクションを行うのではなく、DrawerLayout.DrawerListenerからonDrawerClosedでトランザクションを実行してみませんか?
私はこれに最適なソリューションを見つけたと思います!
まず、フラグメントトランザクションを次のようにします。
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();
}
});
Runnableを投稿するのは役に立たないように見えますが、このハックは、特にAndroid:background="?attr/selectableItemBackground"
クリック可能な要素。
次に、引き出しを閉じますATフラグメントのonResume()関数の終わり(この例では「finalMenuFragment」)):
new Handler().post(new Runnable() {
public void run() {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
});
繰り返しになりますが、Runnableを投稿するのは馬鹿げているように見えますが、これによりアニメーションがスムーズになります。
このように、スムーズなアニメーションが必要な場合、ドロワーはできるだけ早く閉じます。フラグメントに多くのビューが含まれていない場合、引き出しはより速く、遅れなく閉じます。
誰かがこのソリューションをテストした場合、これについてのフィードバックをお願いします。
私はちょうど一行でこの問題を解決しました
あなたの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" />
遅れる場合は、ハードウェアアクセラレーションをリクエストできます。マニフェストがアクティビティにこれを追加する場合
Android:hardwareAccelerated="true"
oncreateメソッドがこのコードを追加する場合
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
アクティビティにハードウェアアクセラレーションが追加されました。ソース: https://developer.Android.com/guide/topics/graphics/hardware-accel.html
これを試して。ドロワーは、ブロードキャストを使用して閉じるように指示されます。これは、ドロワーを閉じる前に、ロードされるアクティビティまたはフラグメントが最初に実行されることを保証するためです。
MainActivity内
private BroadcastReceiver xBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Drawer.isDrawerOpen(GravityCompat.START)){
Drawer.closeDrawers();
}
}
};
@Override
protected void onStart() {
super.onStart();
IntentFilter filter = new IntentFilter();
filter.addAction("my.drawer.listener");
this.registerReceiver(xBroadcastReceiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
this.unregisterReceiver(xBroadcastReceiver);
}
内部アクティビティまたはフラグメント
@Override
public void onStart() {
super.onStart();
Intent intent = new Intent();
intent.setAction("my.drawer.listener");
getActivity().sendBroadcast(intent);
}
onCreateまたはonAttachから以前のプロセスに変更できますが、アプリによって異なります。
フラグメントトランザクションに遅延を使用することが最も不安定なソリューションだと思います。
OnDrawerClosedでそれらを行うと、クローズとフラグメントの表示との間にわずかな遅れが生じます。
ナビゲーションをクリックした直後にトランザクションを実行し、postDelayed 200msでドロワーを閉じます(nullでない場合に備えて、実行可能なチェックで)。フラグメントは、ドロワーが閉じ始める直前に開きます。
タップから引き出しが閉じるまでの遅延が、引き出しを閉じて次のフラグメントが表示された後の遅延よりも短いだけでなく、ユーザーが画面から指を離すとUXが良くなります-遅延はそれほど顕著ではありません。