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
ItemListActivity.kt
ItemDetailFragment.kt
ItemDetailActivity.kt
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
Posta un commento