I created an Android app with custom Toolbar and NavigationDrawer. When I started the app in landscape screen (and also rotate the app from portrait to landscape), the app always showed blinking infinitely. Although, I rotated to portrait, it kept blinking. I used Android API 22 and tested on Nexus 5 (Android 5.1.0).
This is my code:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example">
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyTheme.NoActionBar">
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.SettingsActivity"
android:configChanges="locale"
android:label="@string/settings"
android:parentActivityName=".activity.MainActivity"
android:theme="@style/MyTheme.Light">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.MainActivity" />
</activity>
</application>
</manifest>
MainActivity.java
package com.example.activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.example.R;
import com.example.nav.NavDrawerItem;
import com.example.nav.NavDrawerListAdapter;
import com.example.util.VersionUtil;
import java.util.ArrayList;
public class MainActivity extends ActionBarActivity {
private Toolbar mToolbar;
private DrawerLayout mDrawerLayout;
private LinearLayout mDrawerRoot;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private NavDrawerListAdapter mDrawerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDrawerList = (ListView) findViewById(R.id.drawer_list);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.main_drawer_layout);
mDrawerRoot = (LinearLayout) findViewById(R.id.drawer_root);
initNavigationDrawer();
}
protected void initNavigationDrawer() {
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
String[] navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
TypedArray navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
TypedArray navMenuSelectedIcons = getResources().obtainTypedArray(R.array.nav_drawer_selected_icons);
ArrayList<NavDrawerItem> navDrawerItems = new ArrayList<>();
for (int i = 0, len = navMenuTitles.length; i < len; i++) {
navDrawerItems.add(new NavDrawerItem(navMenuTitles[i], navMenuIcons.getResourceId(i, -1), navMenuSelectedIcons.getResourceId(i, -1), false));
}
// Recycle the typed array
navMenuIcons.recycle();
navMenuSelectedIcons.recycle();
// setting the nav drawer list adapter
mDrawerAdapter = new NavDrawerListAdapter(getApplicationContext(), navDrawerItems);
mDrawerList.setAdapter(mDrawerAdapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
mDrawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
selectDrawerMenuItem(0);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void setTitle(CharSequence title) {
if (mToolbar != null) {
mToolbar.setTitle(title);
} else {
super.setTitle(title);
}
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectDrawerMenuItem(position);
}
}
private void selectDrawerMenuItem(int position) {
switch (position) {
case 3: // Settings
showSettings();
break;
case 4: // Help and Feedback
sendHelpAndFeedbackEmail();
break;
default:
setSelectedNavItemMenu(position);
break;
}
mDrawerLayout.closeDrawer(mDrawerRoot);
}
private void setSelectedNavItemMenu(int position) {
for (int i = 0, size = mDrawerAdapter.getCount(); i < size; i++) {
NavDrawerItem menuItem = (NavDrawerItem) mDrawerAdapter.getItem(i);
menuItem.setSelected(i == position);
}
mDrawerList.setItemChecked(position, true);
}
private void showSettings() {
Intent settingsIntent = new Intent(this, SettingsActivity.class);
startActivity(settingsIntent);
}
private void sendHelpAndFeedbackEmail() {
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setType("text/plain");
String versionName = VersionUtil.getVersionName(this);
int versionCode = VersionUtil.getVersionCode(this);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(getString(R.string.email_help_subject), getText(R.string.app_name), versionName, versionCode));
emailIntent.setData(Uri.parse("mailto:" + getText(R.string.email_send_to)));
emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(emailIntent, getText(R.string.email_chooser_title)));
}
}
Why was the app blinking? Is there any solution to this problem? Thanks.
0 comments:
Post a Comment