25

この例をナビゲーション ドロワーに使用しています。左ドロワーのリストビューのアイテムをクリックすると、いくつかの画像が表示されますが、drawerLayout がスムーズに閉じません。

リストビューのアイテムをクリックした後、左ドロワーのレイアウトをスムーズに閉じるにはどうすればよいですか。

4

5 に答える 5

1

ハンドラーを使用してメッセージキューに 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);

    }
于 2016-01-30T14:06:21.433 に答える
0

ナビゲーション メニューを閉じた後に 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();
}
于 2015-09-21T08:06:09.903 に答える