FragmentDialogSupport.java revision c644c91b91b83a6b400a57b02671f4ef7b7a810b
1c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn/* 2c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * 4c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * you may not use this file except in compliance with the License. 6c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * You may obtain a copy of the License at 7c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * 8c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * 10c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * See the License for the specific language governing permissions and 14c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * limitations under the License. 15c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 16c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 17c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornpackage com.example.android.supportv4.app; 18c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 19c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport com.example.android.supportv4.R; 20c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 21c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.DialogFragment; 22c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.Fragment; 23c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.FragmentActivity; 24c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.support.v4.app.FragmentTransaction; 25c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 26c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.os.Bundle; 27c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.LayoutInflater; 28c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.View; 29c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.View.OnClickListener; 30c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.view.ViewGroup; 31c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.widget.Button; 32c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornimport android.widget.TextView; 33c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 34c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackbornpublic class FragmentDialogSupport extends FragmentActivity { 35c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn int mStackLevel = 0; 36c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 37c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 38c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 39c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onCreate(savedInstanceState); 40c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn setContentView(R.layout.fragment_dialog); 41c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 42c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn View tv = findViewById(R.id.text); 43c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ((TextView)tv).setText("Example of displaying dialogs with a DialogFragment. " 44c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn + "Press the show button below to see the first dialog; pressing " 45c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn + "successive show buttons will display other dialog styles as a " 46c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn + "stack, with dismissing or back going to the previous dialog."); 47c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 48c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Watch for button clicks. 49c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn Button button = (Button)findViewById(R.id.show); 50c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn button.setOnClickListener(new OnClickListener() { 51c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onClick(View v) { 52c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn showDialog(); 53c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 54c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn }); 55c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 56c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn if (savedInstanceState != null) { 57c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mStackLevel = savedInstanceState.getInt("level"); 58c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 59c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 60c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 61c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 62c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onSaveInstanceState(Bundle outState) { 63c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onSaveInstanceState(outState); 64c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn outState.putInt("level", mStackLevel); 65c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 66c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 67c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn//BEGIN_INCLUDE(add_dialog) 68c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn void showDialog() { 69c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mStackLevel++; 70c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 71c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // DialogFragment.show() will take care of adding the fragment 72c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // in a transaction. We also want to remove any currently showing 73c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // dialog, so make our own transaction and take care of that here. 74c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 75c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 76c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn if (prev != null) { 77c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ft.remove(prev); 78c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 79c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ft.addToBackStack(null); 80c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 81c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Create and show the dialog. 82c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel); 83c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn newFragment.show(ft, "dialog"); 84c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 85c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn//END_INCLUDE(add_dialog) 86c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 87c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn static String getNameForNum(int num) { 88c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn switch ((num-1)%6) { 89c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 1: return "STYLE_NO_TITLE"; 90c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 2: return "STYLE_NO_FRAME"; 91c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 3: return "STYLE_NO_INPUT (this window can't receive input, so " 92c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn + "you will need to press the bottom show button)"; 93c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 4: return "STYLE_NORMAL with dark fullscreen theme"; 94c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 5: return "STYLE_NORMAL with light theme"; 95c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 6: return "STYLE_NO_TITLE with light theme"; 96c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 7: return "STYLE_NO_FRAME with light theme"; 97c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 8: return "STYLE_NORMAL with light fullscreen theme"; 98c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 99c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn return "STYLE_NORMAL"; 100c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 101c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 102c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn//BEGIN_INCLUDE(dialog) 103c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public static class MyDialogFragment extends DialogFragment { 104c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn int mNum; 105c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 106c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn /** 107c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * Create a new instance of MyDialogFragment, providing "num" 108c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn * as an argument. 109c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn */ 110c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn static MyDialogFragment newInstance(int num) { 111c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn MyDialogFragment f = new MyDialogFragment(); 112c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 113c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Supply num input as an argument. 114c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn Bundle args = new Bundle(); 115c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn args.putInt("num", num); 116c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn f.setArguments(args); 117c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 118c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn return f; 119c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 120c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 121c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 122c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onCreate(Bundle savedInstanceState) { 123c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn super.onCreate(savedInstanceState); 124c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn mNum = getArguments().getInt("num"); 125c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 126c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Pick a style based on the num. 127c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn int style = DialogFragment.STYLE_NORMAL, theme = 0; 128c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn switch ((mNum-1)%6) { 129c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 1: style = DialogFragment.STYLE_NO_TITLE; break; 130c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 2: style = DialogFragment.STYLE_NO_FRAME; break; 131c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 3: style = DialogFragment.STYLE_NO_INPUT; break; 132c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 4: style = DialogFragment.STYLE_NORMAL; break; 133c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 5: style = DialogFragment.STYLE_NO_TITLE; break; 134c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 6: style = DialogFragment.STYLE_NO_FRAME; break; 135c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 7: style = DialogFragment.STYLE_NORMAL; break; 136c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 137c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn switch ((mNum-1)%6) { 138c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 2: theme = android.R.style.Theme_Panel; break; 139c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 4: theme = android.R.style.Theme; break; 140c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 5: theme = android.R.style.Theme_Light; break; 141c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 6: theme = android.R.style.Theme_Light_Panel; break; 142c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn case 7: theme = android.R.style.Theme_Light; break; 143c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 144c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn setStyle(style, theme); 145c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 146c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 147c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn @Override 148c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, 149c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn Bundle savedInstanceState) { 150c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn View v = inflater.inflate(R.layout.fragment_dialog, container, false); 151c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn View tv = v.findViewById(R.id.text); 152c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ((TextView)tv).setText("Dialog #" + mNum + ": using style " 153c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn + getNameForNum(mNum)); 154c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 155c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // Watch for button clicks. 156c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn Button button = (Button)v.findViewById(R.id.show); 157c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn button.setOnClickListener(new OnClickListener() { 158c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn public void onClick(View v) { 159c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn // When button is clicked, call up to owning activity. 160c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn ((FragmentDialogSupport)getActivity()).showDialog(); 161c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 162c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn }); 163c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn 164c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn return v; 165c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 166c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn } 167c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn//END_INCLUDE(dialog) 168c644c91b91b83a6b400a57b02671f4ef7b7a810bDianne Hackborn} 169