Acceder

Ver la Versión Completa : App bar en activity de settings


elamas
15/01/16, 10:49:39
Hola,
tengo una aplicación simple con una actividad principal con app bar y una activity se settings.

El caso es que no sé poner el app bar en la activity de settings y yo creo que debería hacerlo para que una vez modificadas las settings el usuario pueda volver a la activity principal pulsando el botón de "up" del app bar y no al botón de back del teléfono como tiene que hacer ahora.

Para la activity de settings he seguido esto
http://developer.android.com/intl/es/guide/topics/ui/settings.html#Fragment

Para la app bar en el activity pricipal tengo esto en el layout
<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>
y esto en el onCreate
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

La Settings activity tiene esto
public class SettingsActivity extends AppCompatActivity {
override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment {
override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.pref_general);
}
}
}

y el R.xml.pref_general
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:key="@string/pref_key_last_number"
android:title="@string/pref_title_last_number"
android:summary="@string/pref_summary_last_number"
android:dialogTitle="@string/pref_dialog_title_last_number"
android:defaultValue="@integer/pref_default_last_number"
android:inputType="number"/>
</PreferenceScreen>

Es decir, no tengo un layout para la setting de activities y no sé cómo ponerle un app bar.

Gracias

kriogeN
15/01/16, 13:12:30
Establece un Layout al SettingsActivity que tenga Toolbar, y en vez de hacer el replace sobre android.R.id.content lo haces sobre un espacio reservado para tu Fragment en ese Layout.

elamas
15/01/16, 13:18:45
Hola kriogeN,
muchas gracias por tu ayuda, lo pruebo en cuanto pueda y te cuento.

Un saludo

elamas
15/01/16, 23:15:39
Hola kriogeN,
genial, me funciona con lo que me has dicho, muchas gracias.

Otra pregunta. ¿Se podría sacar la toolbar a un fragment para no duplicar código?

Ahora mismo tengo todo este código repetido en las dos activities y si fuera una app con más activities habría que copiarlo en todas

override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_settings);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setLogo(R.drawable.ic_action_bar);

// Get a support ActionBar corresponding to this toolbar
ActionBar ab = getSupportActionBar();

// Enable the Up button
ab.setDisplayHomeAsUpEnabled(true);

.....
}

override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
//startActivity(new Intent(this, SettingsActivity.class));
startActivity(new Intent(this, SettingsActivity.class));
return true;
}

return super.onOptionsItemSelected(item);
}


No sé si se podría porque veo por ejemplo que el método setSupportActionBar(toolbar) es de la clase AppCompatActivity y a lo mejor no se puede en un Fragment.

Un saludo

kriogeN
15/01/16, 23:39:21
La Toolbar tienes que asignarla al ActionBar de la Activity, y si además tiene menú también lo consume de la Activity.

Tener a la Toolbar como tal en un Fragment si puedes, no deja de ser un View como cualquier otro, pero el código en la Activity tendrías que seguir poniéndolo, como mínimo los 2 del OptionsMenu. No ganas mucho y quizás no sea muy eficiente.

elamas
16/01/16, 22:27:35
Ok, por ahora lo dejo así. Si en el futuro estoy más suelto le daré una vuelta.

Gracias