我正在使用navigation drawer library。
现在我想更改导航抽屉的onClick事件中的内容。 但是没有出现任何问题,我也没有任何问题。
如何实现FragmentManager成功更改片段?
我之前已经使用了导航抽屉。 但我从未使用过协调器布局。也许这就是问题?
main_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.stack.overflow.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/container_body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
content_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.stack.overflow.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
MainActivity:
public class MainActivity extends AppCompatActivity {
private static final int PROFILE_SETTING = 1;
private AccountHeader headerResult = null;
private Drawer result = null;
private boolean opened = false;
private Activity mActivity = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final IProfile profile1 = new ProfileDrawerItem().withName("Sample User").withEmail("sample@sample.com").withIcon(R.drawable.ic_starticon).withIdentifier(104);
final IProfile profile2 = new ProfileDrawerItem().withName("Sample User").withEmail("sample@sample.com").withIcon(R.drawable.ic_starticon).withIdentifier(105);
headerResult = new AccountHeaderBuilder()
.withActivity(this)
.withHeaderBackground(R.drawable.header)
.addProfiles(
profile1,
//don't ask but google uses 14dp for the add account icon in gmail but 20dp for the normal icons (like manage account)
new ProfileSettingDrawerItem().withName("Add Account").withDescription("Add new GitHub Account").withIcon(new IconicsDrawable(this, GoogleMaterial.Icon.gmd_plus).actionBar().paddingDp(5).colorRes(R.color.material_drawer_primary_text)).withIdentifier(PROFILE_SETTING),
new ProfileSettingDrawerItem().withName("Manage Account").withIcon(GoogleMaterial.Icon.gmd_settings)
)
.withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
@Override
public boolean onProfileChanged(View view, IProfile profile, boolean current) {
//sample usage of the onProfileChanged listener
//if the clicked item has the identifier 1 add a new profile ;)
if (profile instanceof IDrawerItem && ((IDrawerItem) profile).getIdentifier() == PROFILE_SETTING) {
int count = 100 + headerResult.getProfiles().size() + 1;
IProfile newProfile = new ProfileDrawerItem().withNameShown(true).withName("Batman" + count).withEmail("batman" + count + "@gmail.com").withIcon(R.drawable.ic_starticon).withIdentifier(count);
if (headerResult.getProfiles() != null) {
//we know that there are 2 setting elements. set the new profile above them ;)
headerResult.addProfile(newProfile, headerResult.getProfiles().size() - 2);
} else {
headerResult.addProfiles(newProfile);
}
}
return false;
}
})
.withSavedInstance(savedInstanceState)
.build();
result = new DrawerBuilder()
.withActivity(this)
.withToolbar(toolbar)
.withHasStableIds(true)
.withAccountHeader(headerResult) //set the AccountHeader we created earlier for the header
.addDrawerItems(
new PrimaryDrawerItem().withName("Dokumentation").withDescription("mobile Office").withIcon(GoogleMaterial.Icon.gmd_sun).withIdentifier(1).withSelectable(false),
new SecondaryDrawerItem().withName("Datenbank").withIcon(GoogleMaterial.Icon.gmd_collection_case_play).withIdentifier(2).withSelectable(false)
) // add the items we want to use with our Drawer
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
//check if the drawerItem is set.
//there are different reasons for the drawerItem to be null
//--> click on the header
//--> click on the footer
//those items don't contain a drawerItem
if (drawerItem != null) {
Intent intent = null;
if (drawerItem.getIdentifier() == 1) {
displayView(0);
} else if (drawerItem.getIdentifier() == 2) {
if (opened) {
//remove the items which are hidden
result.removeItems(2000, 2001, 2002, 2003);
} else {
int curPos = result.getPosition(drawerItem);
result.addItemsAtPosition(
curPos,
new SecondaryDrawerItem().withName("Anlage").withLevel(2).withIcon(GoogleMaterial.Icon.gmd_8tracks).withIdentifier(2000),
new SecondaryDrawerItem().withName("Maschine").withLevel(2).withIcon(GoogleMaterial.Icon.gmd_8tracks).withIdentifier(2001),
new SecondaryDrawerItem().withName("Eigenschaften").withLevel(2).withIcon(GoogleMaterial.Icon.gmd_8tracks).withIdentifier(2002),
new SecondaryDrawerItem().withName("Werte").withLevel(2).withIcon(GoogleMaterial.Icon.gmd_8tracks).withIdentifier(2003)
);
}
opened = !opened;
return true;
} else if (drawerItem.getIdentifier() == 2000) {
} else if (drawerItem.getIdentifier() == 2001) {
} else if (drawerItem.getIdentifier() == 2002) {
} else if (drawerItem.getIdentifier() == 2003) {
}
})
.withSavedInstance(savedInstanceState)
.withShowDrawerOnFirstLaunch(true)
.build();
RecyclerViewCacheUtil.getInstance().withCacheSize(2).init(result);
if (savedInstanceState == null) {
//result.setSelection(1, false);
//set the active profile
headerResult.setActiveProfile(profile2);
}
result.updateBadge(2, new StringHolder(10 + ""));
}
private void displayView(int position) {
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (position) {
case 0:
fragment = new FragmentAnlage();
title = "Anlage";
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
getSupportActionBar().setTitle(title);
}
}
}
我的朋友:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.stack.overflow"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile('com.mikepenz:materialdrawer:4.6.4@aar') {
transitive = true
}
compile 'com.mikepenz:google-material-typeface:2.2.0.1@aar'
compile 'com.mikepenz:fontawesome-typeface:4.4.0.1@aar'
compile 'com.mikepenz:octicons-typeface:3.0.0.1@aar'
}
答案 0 :(得分:0)
这里有一个很好的视频,解释并展示如何使用带有片段的导航抽屉,包括代码: