1) Activity LifeCycle
a) Zachowywanie stanu aplikacji (np. nr konta bankowego – po obróceniu telefonu;)):
https://developer.android.com/guide/components/activities/activity-lifecycle.html#saras
b) AsyncTask i Loaders, Caching (na wypadek obrotu telefonu, gdy sa pobierane dane z sieci/bazy)
https://developer.android.com/guide/components/loaders.html
https://developer.android.com/reference/android/content/AsyncTaskLoader.html
https://developer.android.com/training/efficient-downloads/redundant_redundant.html
2)Ustawienia użytkownika (zapisywane do pliku):
a)
https://developer.android.com/reference/android/support/v14/preference/PreferenceFragment.html
https://developer.android.com/reference/android/preference/package-summary.html
https://developer.android.com/reference/android/content/SharedPreferences.html
https://material.io/guidelines/patterns/settings.html
b) jak sprawdzac poprawność wpisanych danych do preferencji:
Step 1: Implement the OnPreferenceChangeListener:
public class SettingsFragment extends PreferenceFragmentCompat implements OnSharedPreferenceChangeListener, Preference.OnPreferenceChangeListener
Step 2: Attach the listener to the size preference in onCreatePreferences
@Override
public void onCreatePreferences(Bundle bundle, String s) {
/* Other preference setup code code */
//...
Preference preference = findPreference(getString(R.string.pref_size_key));
preference.setOnPreferenceChangeListener(this);
}
Step 3: Implement onPreferenceChange
This code will first try to convert the preference into a number and then checks that the number is between 0 and 3. If either of these fail, a toast will be show and false is returned. By returning false, the incorrect value is not saved to shared preferences.
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast error = Toast.makeText(getContext(), "Please select a number between 0.1 and 3", Toast.LENGTH_SHORT);
String sizeKey = getString(R.string.pref_size_key);
if (preference.getKey().equals(sizeKey)) {
String stringSize = ((String) (newValue)).trim();
if (stringSize == null) stringSize = "1";
try {
float size = Float.parseFloat(stringSize);
if (size > 3 || size <= 0) {
error.show();
return false;
}
} catch (NumberFormatException nfe) {
error.show();
return false;
}
}
return true;
}
c) w pliku gradle dodajemy:
compile ’com.android.support:preference–v7:27.0.2′
wiecej info o dołaczanych bibliotekach: https://developer.android.com/topic/libraries/support-library/packages.html
3) Aby aktywność potomna miala przycisk 'Back’
w pliku AndroidManifest.xml
<activity android:name=".SettingsActivity" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity" />
w metodzie onCreate:
@Override
publicvoid onCreate(Bundle savedInstanceState){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
oraz
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
4) ładne menu w pasku statusu niezajmujące dużo miejsca:
plik /res/menu/menu.xml
<menu 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"
tools:context="com.example.android.sunshine.DetailActivity">
<item android:id="@+id/action_refresh" android:orderInCategory="1" android:title="@string/action_refresh" app:showAsAction="ifRoom"/> <item android:id="@+id/action_settings" android:orderInCategory="2" android:title="@string/action_settings" app:showAsAction="ifRoom"/> <item android:id="@+id/action_map" android:title="@string/action_map" app:showAsAction="never" />
później odwołujemy się do niego przez:
w aktywności, która ma mieć to menu
@Override public boolean onCreateOptionsMenu(Menu menu) { /* Use AppCompatActivity's method getMenuInflater to get a handle on the menu inflater */ MenuInflater inflater = getMenuInflater(); /* Use the inflater's inflate method to inflate our menu layout to this menu */ inflater.inflate(R.menu.forecast, menu); /* Return true so that the menu is displayed in the Toolbar */ return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_refresh) { invalidateData(); getSupportLoaderManager().restartLoader(FORECAST_LOADER_ID, null, this); return true; } if (id == R.id.action_map) { openLocationInMap(); return true; } return super.onOptionsItemSelected(item); } lub tak:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.detail, menu); Intent intentSettings=new Intent(this,SettingsActivity.class); menu.findItem(R.id.action_settings).setIntent(intentSettings); MenuItem menuItem = menu.findItem(R.id.action_share); menuItem.setIntent(createShareForecastIntent()); return true; }