簡體   English   中英

從片段訪問和使用活動導航抽屜

[英]Access and use activity nav drawer from fragment

有沒有辦法從片段中訪問我在活動中創建的導航抽屜? 我還希望能夠使用后按功能。 我的活動在手機上啟動,而我的片段在平板電腦上啟動。

活動課

public class BakerlooHDNActivity extends AppCompatActivity {

    private Drawer result = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bakerloo_hdn);


        final String actionBarColor = "#B36305";

        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);

        if(getSupportActionBar()!=null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setTitle(Html.fromHtml("<font color='#FFFFFF'>" + getResources().getString(R.string.hdn) + "</font>"));
            getSupportActionBar().setSubtitle(Html.fromHtml("<font color='#FFFFFF'>" + getResources().getString(R.string.zone_3) + "</font>"));

            final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_mtrl_am_alpha);
            upArrow.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);
            getSupportActionBar().setHomeAsUpIndicator(upArrow);
        }

        // start of navigation drawer
        headerResult = new AccountHeaderBuilder()
                .withActivity(getActivity())
                .withCompactStyle(true)
                .withHeaderBackground(R.color.bakerloo)
                .withProfileImagesVisible(false)
                .withTextColor(Color.parseColor("#FFFFFF"))
                .withSelectionListEnabled(false)

                .addProfiles(
                        new ProfileDrawerItem().withName(getString(R.string.hdn)).withEmail(getString(R.string.hello_world))
                )
                .build();

        result = new DrawerBuilder()
                .withActivity(getActivity())
                .withAccountHeader(headerResult)
                .withTranslucentStatusBar(false)
                .withActionBarDrawerToggle(false)
                .addDrawerItems(
                        new PrimaryDrawerItem().withName(R.string.hello_world).withIdentifier(1).withCheckable(false)
                )
                .build();
        // end of navigation drawer
    }


    @Override
    public void onBackPressed() {
        if (result.isDrawerOpen()) {
            result.closeDrawer();
        } else {
            super.onBackPressed();
        }
        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent("BACKPRESSED_TAG"));
    }
}

片段類

public class FragmentBakerlooHDN extends android.support.v4.app.Fragment {

    public FragmentBakerlooHDN() {
        // Required empty constructor
    }

    BroadcastReceiver onNotice = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
             result.closeDrawer();
        }
    };

    private AccountHeader headerResult = null;
    private Drawer result = null;

    private boolean mTwoPane;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice, new IntentFilter("BACKPRESSED_TAG"));

        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_bakerloo_hdn, container, false);

        super.onCreate(savedInstanceState);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        View v = getView();

        super.onActivityCreated(savedInstanceState);
    }
}

我永遠不會有碎片直接訪問抽屜。 相反,我將通過Fragment中的回調方法調用Activity,然后訪問抽屜。

重新閱讀您的問題后,我提出以下建議:

  • 您的Activity已經關閉了抽屜,因此無需在片段中再次進行。
  • 您應該有2個片段,一個用於平板電腦,一個用於手機

如果您仍然需要與Fragment通信,請執行以下操作:

public void onBackPressed() {
    if (result.isDrawerOpen()) {
        result.closeDrawer();
        getSupportFragmentManager().findFragmentByTag("FRAGMENT_TAG").doSomething();
    } else {
        super.onBackPressed();
    }
}

在您的片段中添加以下內容:

public void doSomething() {
    // Do it here
}

我的建議基本上是在片段中創建一個公共方法。 活動調用傳遞抽屜對象的公共方法。 真的很簡單。 這具有通過引用傳遞抽屜的效果。

代碼建議。 在BakerlooHDNActivity類中:

AccountHeader headerResult;

if (savedInstanceState == null) {
   FragmentBakerlooHDN myFragment = new FragmentBakerlooHDN();
   myFragment.setDrawer(headerResult);
}

在FragmentBakerlooHDN類中:

private AccountHeader myDrawer;

public void setDrawer(final AccountHeader drawer) {
   this.myDrawer = drawer;
}

筆記:

  • 您可以將對象headerResult傳遞給FragmentBakerlooHDN構造函數,但是由於片段的生命周期,我通常不會這樣做。
  • 現在,您可以在創建片段的新實例后立即調用public setDrawer。 但是,UI和片段生命周期可能存在問題。
  • 如果您修改抽屜的內容,請在活動中或在片段中進行,而不要同時進行。 同樣,此解決方案是通過引用傳遞抽屜對象。 因此它足夠強大以至於危險。 另一種方法是使用像Sweder所說的那樣使用回調/偵聽器的技術。
  • 對象myDrawer聲明為AccountHeader而不是AccountHeaderBuilder。

我的建議是在Activity中使用onBackPressed方法。 我更新了有關NavigationDrawer的教程的源代碼( https://github.com/AlexZhukovich/NavigationDrawerTutorial )。 希望對您有幫助。 在本教程中,我使用了來自com.android.support:design的NavigationDrawer。

    @Override
    public void onBackPressed() {
        if (mDrawerLayout.isDrawerOpen(mNavigationView))
            mDrawerLayout.closeDrawers();
        else
            super.onBackPressed();
    }

對我來說,它適用於平板電腦和手機。 (Nexus設備)。

我為您創建了帶有片段的簡單活動。 此活動顯示2個片段,但是單擊返回后,刪除第二個片段。

    public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        getSupportFragmentManager().beginTransaction().add(R.id.container, new DummyFragment(), "TEST").commit();
        getSupportFragmentManager().beginTransaction().add(R.id.container2, new DummyFragment(), "TEST2").commit();
    }

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().findFragmentByTag("TEST2") != null && getSupportFragmentManager().findFragmentByTag("TEST2").isVisible()) {
            getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag("TEST2")).commit();
        } else {
            super.onBackPressed();
        }
    }

    private class DummyFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_test, container, false);
            return view;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM