1

NavDrawerl のレイアウトと初期化をホストする AbstractActivity を使用して、複数のアクティビティで navigationDrawer を使用するアプローチを選択したいと思いました。継承されたアクティビティは、そこでレイアウトを drawerLayout のコンテンツとして設定するだけです。すべて正常に動作し、ドロワーはどこからでもアクセスできます。1 つのリスト項目をクリックすると、新しいアクティビティが開始されます。

プロセス間通信とバックグラウンド サービスのすべてを実装する 10,000 行のコードをホストする単一のアクティビティが必要ないため、これを試すことにしました。すべて正常に動作します。新しく開始されたアクティビティで引き出しが実際に閉じられていることを除いて。通常、リストから何かを選択すると、かなりうまくスライドして戻るため、これは良くありません。妥協点を見つけて、新しいアクティビティのクロージングをアニメートするだけで、大きな違いはありませんでした。しかし、すべての呼び出しがあるため、機能させることができません


public abstract class AbstractNavDrawerActivity extends FragmentActivity {

    private CharSequence mTitle;
    private CharSequence mDrawerTitle;
    private ActionBarDrawerToggle mDrawerToggle;

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerLayout.addOnLayoutChangeListener(new OnLayoutChangeListener() {

            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight,
                    int oldBottom) {

            }
        });
        // mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(
                this, /* host Activity */
                mDrawerLayout, /* DrawerLayout object */
                R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
                R.string.drawer_open, /* "open drawer" description for accessibility */
                R.string.drawer_close /* "close drawer" description for accessibility */
                ) {
                    public void onDrawerClosed(View view) {
                        getActionBar().setTitle(mTitle);
                        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                    }

                    public void onDrawerOpened(View drawerView) {
                        getActionBar().setTitle(mDrawerTitle);
                        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                    }
                };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        ViewGroup flContent = (ViewGroup) findViewById(R.id.content);
        flContent.addView(getContentView());

        ViewGroup leftDrawer = (ViewGroup) findViewById(R.id.left_drawer);
        MenuFragment mf = new MenuFragment();
        mf.setListener(new DrawerItemClickListener());
        getSupportFragmentManager().beginTransaction().add(R.id.left_drawer, mf)
                .commitAllowingStateLoss();
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (getIntent().hasExtra("close")) {
            if (getIntent().getExtras().getBoolean("close")) {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
        }
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();

    }
    @Override
    protected void onResume() {
        super.onResume();
        if (getIntent().hasExtra("close")) {
            if (getIntent().getExtras().getBoolean("close")) {
                mDrawerLayout.closeDrawer(Gravity.LEFT);
            }
        }
    }

    protected abstract View getContentView();

    @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);
        return true;
    }

    /* The click listner for ListView in the navigation drawer */
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            selectItem(position);
        }
    }

    private void selectItem(int position) {
        switch (position) {
        case 0:
            startActivity(new Intent(this, OneActivity.class));
            break;
        case 1:
            Intent it = new Intent(this, TwoActivity.class);
            it.putExtra("close", true);
            startActivity(it);
            break;

        case 2:
            mDrawerLayout.closeDrawer(Gravity.LEFT);
            break;
        default:
            break;
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}


public class OneActivity extends AbstractNavDrawerActivity {

    @Override
    protected View getContentView() {
        return getLayoutInflater().inflate(R.layout.ac_one, null);
    }

これを「かっこいい」ように機能させる方法を知っている人はいますか。複雑なアプリにはいい解決策になると思います。One Activity 1943209483280 Fragment Action Listener アプローチは好きではありません。

4

0 に答える 0