Created
November 27, 2014 00:10
-
-
Save natebass/4fe075a71d12203da408 to your computer and use it in GitHub Desktop.
Android Studio Master/Detail Flow Template
This file contains hidden or 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.natebass.thefrag2; | |
| import android.content.Intent; | |
| import android.os.Bundle; | |
| import android.app.Activity; | |
| import android.view.MenuItem; | |
| /** | |
| * An activity representing a single Item detail screen. This | |
| * activity is only used on handset devices. On tablet-size devices, | |
| * item details are presented side-by-side with a list of items | |
| * in a {@link ItemListActivity}. | |
| * <p/> | |
| * This activity is mostly just a 'shell' activity containing nothing | |
| * more than a {@link ItemDetailFragment}. | |
| */ | |
| public class ItemDetailActivity extends Activity { | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.activity_item_detail); | |
| // Show the Up button in the action bar. | |
| getActionBar().setDisplayHomeAsUpEnabled(true); | |
| // savedInstanceState is non-null when there is fragment state | |
| // saved from previous configurations of this activity | |
| // (e.g. when rotating the screen from portrait to landscape). | |
| // In this case, the fragment will automatically be re-added | |
| // to its container so we don't need to manually add it. | |
| // For more information, see the Fragments API guide at: | |
| // | |
| // http://developer.android.com/guide/components/fragments.html | |
| // | |
| if (savedInstanceState == null) { | |
| // Create the detail fragment and add it to the activity | |
| // using a fragment transaction. | |
| Bundle arguments = new Bundle(); | |
| arguments.putString(ItemDetailFragment.ARG_ITEM_ID, | |
| getIntent().getStringExtra(ItemDetailFragment.ARG_ITEM_ID)); | |
| ItemDetailFragment fragment = new ItemDetailFragment(); | |
| fragment.setArguments(arguments); | |
| getFragmentManager().beginTransaction() | |
| .add(R.id.item_detail_container, fragment) | |
| .commit(); | |
| } | |
| } | |
| @Override | |
| public boolean onOptionsItemSelected(MenuItem item) { | |
| int id = item.getItemId(); | |
| if (id == android.R.id.home) { | |
| // This ID represents the Home or Up button. In the case of this | |
| // activity, the Up button is shown. For | |
| // more details, see the Navigation pattern on Android Design: | |
| // | |
| // http://developer.android.com/design/patterns/navigation.html#up-vs-back | |
| // | |
| navigateUpTo(new Intent(this, ItemListActivity.class)); | |
| return true; | |
| } | |
| return super.onOptionsItemSelected(item); | |
| } | |
| } |
This file contains hidden or 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.natebass.thefrag2; | |
| import android.os.Bundle; | |
| import android.app.Fragment; | |
| import android.view.LayoutInflater; | |
| import android.view.View; | |
| import android.view.ViewGroup; | |
| import android.widget.TextView; | |
| import com.natebass.thefrag2.dummy.DummyContent; | |
| /** | |
| * A fragment representing a single Item detail screen. | |
| * This fragment is either contained in a {@link ItemListActivity} | |
| * in two-pane mode (on tablets) or a {@link ItemDetailActivity} | |
| * on handsets. | |
| */ | |
| public class ItemDetailFragment extends Fragment { | |
| /** | |
| * The fragment argument representing the item ID that this fragment | |
| * represents. | |
| */ | |
| public static final String ARG_ITEM_ID = "item_id"; | |
| /** | |
| * The dummy content this fragment is presenting. | |
| */ | |
| private DummyContent.DummyItem mItem; | |
| /** | |
| * Mandatory empty constructor for the fragment manager to instantiate the | |
| * fragment (e.g. upon screen orientation changes). | |
| */ | |
| public ItemDetailFragment() { | |
| } | |
| @Override | |
| public void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| if (getArguments().containsKey(ARG_ITEM_ID)) { | |
| // Load the dummy content specified by the fragment | |
| // arguments. In a real-world scenario, use a Loader | |
| // to load content from a content provider. | |
| mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID)); | |
| } | |
| } | |
| @Override | |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, | |
| Bundle savedInstanceState) { | |
| View rootView = inflater.inflate(R.layout.fragment_item_detail, container, false); | |
| // Show the dummy content as text in a TextView. | |
| if (mItem != null) { | |
| ((TextView) rootView.findViewById(R.id.item_detail)).setText(mItem.content); | |
| } | |
| return rootView; | |
| } | |
| } |
This file contains hidden or 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.natebass.thefrag2; | |
| import android.content.Intent; | |
| import android.os.Bundle; | |
| import android.app.Activity; | |
| /** | |
| * An activity representing a list of Items. This activity | |
| * has different presentations for handset and tablet-size devices. On | |
| * handsets, the activity presents a list of items, which when touched, | |
| * lead to a {@link ItemDetailActivity} representing | |
| * item details. On tablets, the activity presents the list of items and | |
| * item details side-by-side using two vertical panes. | |
| * <p/> | |
| * The activity makes heavy use of fragments. The list of items is a | |
| * {@link ItemListFragment} and the item details | |
| * (if present) is a {@link ItemDetailFragment}. | |
| * <p/> | |
| * This activity also implements the required | |
| * {@link ItemListFragment.Callbacks} interface | |
| * to listen for item selections. | |
| */ | |
| public class ItemListActivity extends Activity | |
| implements ItemListFragment.Callbacks { | |
| /** | |
| * Whether or not the activity is in two-pane mode, i.e. running on a tablet | |
| * device. | |
| */ | |
| private boolean mTwoPane; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.activity_item_list); | |
| if (findViewById(R.id.item_detail_container) != null) { | |
| // The detail container view will be present only in the | |
| // large-screen layouts (res/values-large and | |
| // res/values-sw600dp). If this view is present, then the | |
| // activity should be in two-pane mode. | |
| mTwoPane = true; | |
| // In two-pane mode, list items should be given the | |
| // 'activated' state when touched. | |
| ((ItemListFragment) getFragmentManager() | |
| .findFragmentById(R.id.item_list)) | |
| .setActivateOnItemClick(true); | |
| } | |
| // TODO: If exposing deep links into your app, handle intents here. | |
| } | |
| /** | |
| * Callback method from {@link ItemListFragment.Callbacks} | |
| * indicating that the item with the given ID was selected. | |
| */ | |
| @Override | |
| public void onItemSelected(String id) { | |
| if (mTwoPane) { | |
| // In two-pane mode, show the detail view in this activity by | |
| // adding or replacing the detail fragment using a | |
| // fragment transaction. | |
| Bundle arguments = new Bundle(); | |
| arguments.putString(ItemDetailFragment.ARG_ITEM_ID, id); | |
| ItemDetailFragment fragment = new ItemDetailFragment(); | |
| fragment.setArguments(arguments); | |
| getFragmentManager().beginTransaction() | |
| .replace(R.id.item_detail_container, fragment) | |
| .commit(); | |
| } else { | |
| // In single-pane mode, simply start the detail activity | |
| // for the selected item ID. | |
| Intent detailIntent = new Intent(this, ItemDetailActivity.class); | |
| detailIntent.putExtra(ItemDetailFragment.ARG_ITEM_ID, id); | |
| startActivity(detailIntent); | |
| } | |
| } | |
| } |
This file contains hidden or 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.natebass.thefrag2; | |
| import android.app.Activity; | |
| import android.os.Bundle; | |
| import android.app.ListFragment; | |
| import android.view.View; | |
| import android.widget.ArrayAdapter; | |
| import android.widget.ListView; | |
| import com.natebass.thefrag2.dummy.DummyContent; | |
| /** | |
| * A list fragment representing a list of Items. This fragment | |
| * also supports tablet devices by allowing list items to be given an | |
| * 'activated' state upon selection. This helps indicate which item is | |
| * currently being viewed in a {@link ItemDetailFragment}. | |
| * <p/> | |
| * Activities containing this fragment MUST implement the {@link Callbacks} | |
| * interface. | |
| */ | |
| public class ItemListFragment extends ListFragment { | |
| /** | |
| * The serialization (saved instance state) Bundle key representing the | |
| * activated item position. Only used on tablets. | |
| */ | |
| private static final String STATE_ACTIVATED_POSITION = "activated_position"; | |
| /** | |
| * The fragment's current callback object, which is notified of list item | |
| * clicks. | |
| */ | |
| private Callbacks mCallbacks = sDummyCallbacks; | |
| /** | |
| * The current activated item position. Only used on tablets. | |
| */ | |
| private int mActivatedPosition = ListView.INVALID_POSITION; | |
| /** | |
| * A callback interface that all activities containing this fragment must | |
| * implement. This mechanism allows activities to be notified of item | |
| * selections. | |
| */ | |
| public interface Callbacks { | |
| /** | |
| * Callback for when an item has been selected. | |
| */ | |
| public void onItemSelected(String id); | |
| } | |
| /** | |
| * A dummy implementation of the {@link Callbacks} interface that does | |
| * nothing. Used only when this fragment is not attached to an activity. | |
| */ | |
| private static Callbacks sDummyCallbacks = new Callbacks() { | |
| @Override | |
| public void onItemSelected(String id) { | |
| } | |
| }; | |
| /** | |
| * Mandatory empty constructor for the fragment manager to instantiate the | |
| * fragment (e.g. upon screen orientation changes). | |
| */ | |
| public ItemListFragment() { | |
| } | |
| @Override | |
| public void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| // TODO: replace with a real list adapter. | |
| setListAdapter(new ArrayAdapter<DummyContent.DummyItem>( | |
| getActivity(), | |
| android.R.layout.simple_list_item_activated_1, | |
| android.R.id.text1, | |
| DummyContent.ITEMS)); | |
| } | |
| @Override | |
| public void onViewCreated(View view, Bundle savedInstanceState) { | |
| super.onViewCreated(view, savedInstanceState); | |
| // Restore the previously serialized activated item position. | |
| if (savedInstanceState != null | |
| && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { | |
| setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); | |
| } | |
| } | |
| @Override | |
| public void onAttach(Activity activity) { | |
| super.onAttach(activity); | |
| // Activities containing this fragment must implement its callbacks. | |
| if (!(activity instanceof Callbacks)) { | |
| throw new IllegalStateException("Activity must implement fragment's callbacks."); | |
| } | |
| mCallbacks = (Callbacks) activity; | |
| } | |
| @Override | |
| public void onDetach() { | |
| super.onDetach(); | |
| // Reset the active callbacks interface to the dummy implementation. | |
| mCallbacks = sDummyCallbacks; | |
| } | |
| @Override | |
| public void onListItemClick(ListView listView, View view, int position, long id) { | |
| super.onListItemClick(listView, view, position, id); | |
| // Notify the active callbacks interface (the activity, if the | |
| // fragment is attached to one) that an item has been selected. | |
| mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id); | |
| } | |
| @Override | |
| public void onSaveInstanceState(Bundle outState) { | |
| super.onSaveInstanceState(outState); | |
| if (mActivatedPosition != ListView.INVALID_POSITION) { | |
| // Serialize and persist the activated item position. | |
| outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); | |
| } | |
| } | |
| /** | |
| * Turns on activate-on-click mode. When this mode is on, list items will be | |
| * given the 'activated' state when touched. | |
| */ | |
| public void setActivateOnItemClick(boolean activateOnItemClick) { | |
| // When setting CHOICE_MODE_SINGLE, ListView will automatically | |
| // give items the 'activated' state when touched. | |
| getListView().setChoiceMode(activateOnItemClick | |
| ? ListView.CHOICE_MODE_SINGLE | |
| : ListView.CHOICE_MODE_NONE); | |
| } | |
| private void setActivatedPosition(int position) { | |
| if (position == ListView.INVALID_POSITION) { | |
| getListView().setItemChecked(mActivatedPosition, false); | |
| } else { | |
| getListView().setItemChecked(position, true); | |
| } | |
| mActivatedPosition = position; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hols Luis