この例をナビゲーション ドロワーに使用しています。左ドロワーのリストビューのアイテムをクリックすると、いくつかの画像が表示されますが、drawerLayout がスムーズに閉じません。
リストビューのアイテムをクリックした後、左ドロワーのレイアウトをスムーズに閉じるにはどうすればよいですか。
この例をナビゲーション ドロワーに使用しています。左ドロワーのリストビューのアイテムをクリックすると、いくつかの画像が表示されますが、drawerLayout がスムーズに閉じません。
リストビューのアイテムをクリックした後、左ドロワーのレイアウトをスムーズに閉じるにはどうすればよいですか。
ハンドラーを使用してメッセージキューに drawerLayout.closeDrawer() を投稿するだけで、最小限の遅延で問題が解決しました。Handler.postDelayed() がここでの鍵です。
public void selectItem(int position)
{
switch (position)
{
case 0:
DashboardFragment dashboardFragment = new DashboardFragment();
Bundle args = new Bundle();
args.putInt(dashboardFragment.ARG_SCREEN_NUMBER, position);
dashboardFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragmentLayout, dashboardFragment, TAG_DASHBOARD);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
getSupportFragmentManager().executePendingTransactions();
break;
default:
break;
}
// Highlight the selected item, update the title, and close the drawer
drawerList.setItemChecked(position, true);
setTitle(mScreenTitles[position]);
mPendingRunnable = new Runnable()
{
@Override
public void run()
{
drawerLayout.closeDrawer(GravityCompat.START);
}
};
mHandler.postDelayed(mPendingRunnable,50);
}
ナビゲーション メニューを閉じた後に UI を更新する必要があるため、スレッドは使用しません。
次のコードは私にとってはうまくいきます。
UIを更新するためにクラスのメンバー変数としてフラグメントを使用しています
setFragment() 関数を使用してフラグメントをフラグメント変数に割り当てます
onDrawerClosed() イベントで、UI を更新します。
mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
setFragment(position);
}
});
// for getting fragment
protected void setFragment(int p)
{
fragment = null;
switch (position)
{
case 1:
fragment = new DashboardFragment();
break;
}
if (fragment != null)
{
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(p);
mDrawerLayout.closeDrawer(mDrawerList);
}
}
// on close draw , fragment is loaded on screen
public void onDrawerClosed(View view)
{
getSupportActionBar().setTitle(mTitle);
invalidateOptionsMenu();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
}