Passa ai contenuti principali

Android Studio - Master/Detail Flow Activity

Master/Detail Flow Activity

Master/Detail Flow Navigation Activity è un tipo di progetto in cui è presente una lista di voci (Master) e cliccando su ognuna di esse si accede alla propria schermata di dettaglio (Detail)

Vista smartphone

Vista Tablet

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dm.tutorialmasterdetailflow">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ItemListActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".ItemDetailActivity"
android:label="@string/title_item_detail"
android:parentActivityName=".ItemListActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.dm.tutorialmasterdetailflow.ItemListActivity"/>
</activity>
</application>
</manifest>
ItemListActivity.kt
package com.dm.tutorialmasterdetailflow
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.support.design.widget.Snackbar
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.dm.tutorialmasterdetailflow.dummy.DummyContent
import kotlinx.android.synthetic.main.activity_item_list.*
import kotlinx.android.synthetic.main.item_list_content.view.*
import kotlinx.android.synthetic.main.item_list.*
/**
* Un'attività che rappresenta un elenco di ping. Questa attività
* presenta presentazioni diverse per dispositivi di dimensioni di telefono e tablet.
* Sui telefoni, l'attività presenta un elenco di elementi che, se toccati,
* portano a un [ItemDetailActivity] che rappresenta i dettagli degli articoli.
* Sui tablet, l'attività presenta l'elenco degli articoli e i dettagli degli articoli
* affiancati utilizzando due riquadri verticali.
*/
class ItemListActivity : AppCompatActivity() {
/**
* Indica se l'attività è in modalità a due riquadri, ovvero in esecuzione su un
* dispositivo tablet.
*/
private var twoPane: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_item_list)
setSupportActionBar(toolbar)
toolbar.title = title
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
if (item_detail_container != null) {
// La vista contenitore dettagli sarà presente solo in
// layout a grande schermo (res/values-w900dp).
// Se questa vista è presente, allora il
// l'attività dovrebbe essere in modalità a due riquadri.
twoPane = true
}
setupRecyclerView(item_list)
}
private fun setupRecyclerView(recyclerView: RecyclerView) {
recyclerView.adapter = SimpleItemRecyclerViewAdapter(this, DummyContent.ITEMS, twoPane)
}
class SimpleItemRecyclerViewAdapter(
private val parentActivity: ItemListActivity,
private val values: List<DummyContent.DummyItem>,
private val twoPane: Boolean
) :
RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder>() {
private val onClickListener: View.OnClickListener
init {
onClickListener = View.OnClickListener { v ->
val item = v.tag as DummyContent.DummyItem
if (twoPane) {
val fragment = ItemDetailFragment().apply {
arguments = Bundle().apply {
putString(ItemDetailFragment.ARG_ITEM_ID, item.id)
}
}
parentActivity.supportFragmentManager
.beginTransaction()
.replace(R.id.item_detail_container, fragment)
.commit()
} else {
val intent = Intent(v.context, ItemDetailActivity::class.java).apply {
putExtra(ItemDetailFragment.ARG_ITEM_ID, item.id)
}
v.context.startActivity(intent)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_list_content, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = values[position]
holder.idView.text = item.id
holder.contentView.text = item.content
with(holder.itemView) {
tag = item
setOnClickListener(onClickListener)
}
}
override fun getItemCount() = values.size
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val idView: TextView = view.id_text
val contentView: TextView = view.content
}
}
}
ItemDetailFragment.kt
package com.dm.tutorialmasterdetailflow
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.dm.tutorialmasterdetailflow.dummy.DummyContent
import kotlinx.android.synthetic.main.activity_item_detail.*
import kotlinx.android.synthetic.main.item_detail.view.*
/**
* Un frammento che rappresenta una schermata di dettaglio di un singolo elemento.
* Questo frammento è contenuto in un [ItemListActivity]
* in modalità a due riquadri (sui tablet) o in [ItemDetailActivity]
* sui telefoni.
*/
class ItemDetailFragment : Fragment() {
/**
* Il contenuto fittizio presentato da questo frammento.
*/
private var item: DummyContent.DummyItem? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
if (it.containsKey(ARG_ITEM_ID)) {
// Carica il contenuto fittizio specificato dal frammento
// argomenti. In uno scenario del mondo reale, utilizzare un Caricatore
// per caricare il contenuto da un fornitore di contenuti.
item = DummyContent.ITEM_MAP[it.getString(ARG_ITEM_ID)]
activity?.toolbar_layout?.title = item?.content
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.item_detail, container, false)
// Mostra il contenuto fittizio come testo in TextView.
item?.let {
rootView.item_detail.text = it.details
}
return rootView
}
companion object {
/**
* L'argomento frammento che rappresenta l'ID oggetto rappresentato da
* questo frammento.
*/
const val ARG_ITEM_ID = "item_id"
}
}
ItemDetailActivity.kt
package com.dm.tutorialmasterdetailflow
import android.content.Intent
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.view.MenuItem
import kotlinx.android.synthetic.main.activity_item_detail.*
/**
* Un'attività che rappresenta una schermata di dettaglio di un singolo elemento.
* Questa attività viene utilizzata solo su dispositivi di larghezza ridotta.
* Su dispositivi di dimensioni tablet, i dettagli degli articoli vengono
* presentati fianco a fianco con un elenco di articoli in un [ItemListActivity].
*/
class ItemDetailActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_item_detail)
setSupportActionBar(detail_toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own detail action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
// Mostra il pulsante Su nella barra delle azioni.
supportActionBar?.setDisplayHomeAsUpEnabled(true)
// savedInstanceState è un valore non nullo quando esiste uno stato di frammento
// salvato da precedenti configurazioni di questa attività (ad es.
// quando si ruota lo schermo da verticale a orizzontale). In questo caso,
// il frammento verrà automaticamente aggiunto nuovamente al suo contenitore,
// quindi non è necessario aggiungerlo manualmente. Per ulteriori informazioni,
// consultare la guida dell'API Fragments all'indirizzo:
//
// http://developer.android.com/guide/components/fragments.html
//
if (savedInstanceState == null) {
// Crea il frammento di dettaglio e aggiungilo all'attività
// usando una transazione frammentata.
val fragment = ItemDetailFragment().apply {
arguments = Bundle().apply {
putString(
ItemDetailFragment.ARG_ITEM_ID,
intent.getStringExtra(ItemDetailFragment.ARG_ITEM_ID)
)
}
}
supportFragmentManager.beginTransaction()
.add(R.id.item_detail_container, fragment)
.commit()
}
}
override fun onOptionsItemSelected(item: MenuItem) =
when (item.itemId) {
android.R.id.home -> {
// Questo ID rappresenta il pulsante Home o Su. Nel caso di questa
// attività, viene visualizzato il pulsante Su. Per maggiori
// dettagli, vedi il modello di navigazione su Android Design:
//
// http://developer.android.com/design/patterns/navigation.html#up-vs-back
navigateUpTo(Intent(this, ItemListActivity::class.java))
true
}
else -> super.onOptionsItemSelected(item)
}
}

Download Project
Download file APK
Visualizza su


Commenti

Post popolari in questo blog

Android Studio - Impostare lingua app

In questo articolo vedremo come poter selezionare la lingua all'interno della nostra app. Nel precedente articolo in cui si parlava del file string.xml , la lingua dell'app veniva selezionata automaticamente in base alle impostazioni del dispositivo, mentre qui vedremo come poter selezionare a proprio piacimento la lingua che dovrà avere la nostra app indipendentemente dall'impostazione del dispositivo. Per prima cosa creare il layout Ecco un esempio do come può essere il file activity_main.xml Ora creare le stringhe di testo all'interno del file string.xml Ora creare la traduzione del file string.xml nelle varie lingua come descritto in questo articolo Il risultato sarà una serie di file string.xml delle varie lingue impostate. Ora queste di seguito sono tre funzioni che servono per: selezione della lingua salvataggio della selezione nelle preferenze dell'app caricamento della lingua quando si avvia l'app Ecco come si presenta il file Main...

Android Studio - Rinominare il progetto

Rinominare il progetto Android Studio ATTENZIONE!: non eseguire questa procedura se l'app è stata pubblicata su Google Play Store Quando si vuole cambiare nome al progetto: nome cartella in cui è contenuto il progetto package name bisogna eseguire questi passaggi: Andare nella cartella dove è contenuto il progetto Creare una copia del progetto in questione Rinominare la cartella copiata con il nome dell'app (non usare spazi tra le parole) Ora è necessario dire ad Android Studio il nome del nuovo progetto  Aprire Android Studio Aprire il progetto creato in precedenza Una volta caricato il progetto cliccare Build Cliccare Clean Project Attendere che venga eseguito il processo di "pulitura" Cliccare ancora su Build Cliccare su Rebuild Project Attendere che venga ricostruito il progetto Ora aprire la cartella app fino a visualizzare la cartella java Cliccare sull'ingranaggio  Deselezionare la voce Compact Middle Packa...

Arduino - Lettura tensione potenziometro e display LCD

Leggere il valore di un poteziometro (parte 2) Oggi vedremo come leggere il valore in tensione di un potenziometro collegato al pin Analogico A0 di Arduino.