[英]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,然后訪問抽屜。
重新閱讀您的問題后,我提出以下建議:
如果您仍然需要與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;
}
筆記:
我的建議是在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.