Presentation is loading. Please wait.

Presentation is loading. Please wait.

Mobile Programming Lecture 6

Similar presentations


Presentation on theme: "Mobile Programming Lecture 6"— Presentation transcript:

1 Mobile Programming Lecture 6
Fragments, Permissions, BroadcastReceivers

2 Agenda Dynamic UI LayoutInflater Fragments Permissions
BroadcastReceiver

3 Building the UI Dynamically
So far we've been creating UIs that are defined before runtime There are some cases where you will need to build the UI dynamically Consider this XML layout file DynamicUiExample

4 Building the UI Dynamically
<TableLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </TableRow> </TableLayout>

5 Building the UI Dynamically
Now let's look at Java code that can build a similar UI at runtime

6 Building the UI Dynamically
<TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="Medium Text"/> </TableRow> </TableLayout> public void onCreate(Bundle state) { super.onCreate(savedInstanceState); TableLayout layout = new TableLayout(this); TableRow row = new TableRow(this); TextView tv = new TextView(this); tv.setText("Medium Text"); row.addView(tv); layout.addView(row); row = new TableRow(this); setContentView(layout); }

7 Building the UI Dynamically
This argument asks for a Context, e.g. this or getApplicationContext() <TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="Medium Text"/> </TableRow> </TableLayout> public void onCreate(Bundle state) { super.onCreate(savedInstanceState); TableLayout layout = new TableLayout(this); TableRow row = new TableRow(this); TextView tv = new TextView(this); tv.setText("Medium Text"); row.addView(tv); layout.addView(row); row = new TableRow(this); setContentView(layout); }

8 Building the UI Dynamically
"this" refers to the instance of whichever class the code is currently in! <TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="Medium Text"/> </TableRow> </TableLayout> public void onCreate(Bundle state) { super.onCreate(savedInstanceState); TableLayout layout = new TableLayout(this); TableRow row = new TableRow(this); TextView tv = new TextView(this); tv.setText("Medium Text"); row.addView(tv); layout.addView(row); row = new TableRow(this); setContentView(layout); }

9 Building the UI Dynamically
In this case, it would refer to your Activity (since you know that onCreate() is a method of an Activity) <TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="Medium Text"/> </TableRow> </TableLayout> public void onCreate(Bundle state) { super.onCreate(savedInstanceState); TableLayout layout = new TableLayout(this); TableRow row = new TableRow(this); TextView tv = new TextView(this); tv.setText("Medium Text"); row.addView(tv); layout.addView(row); row = new TableRow(this); setContentView(layout); }

10 Building the UI Dynamically
You can't add the same child element twice! This is an easy way to get a Force Close

11 LayoutInflater instantiates a layout XML file into its corresponding View objects use getLayoutInflater() LayoutInflaterExample

12 LayoutInflater @Override public void onCreate(Bundle state) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onCreate(Bundle state) { super.onCreate(savedInstanceState); LayoutInflater inflater = getLayoutInflater(); setContentView( inflater.inflate(R.layout.main, null)); }

13 LayoutInflater @Override public void onCreate(Bundle state) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onCreate(Bundle state) { super.onCreate(savedInstanceState); LayoutInflater inflater = getLayoutInflater(); setContentView( inflater.inflate(R.layout.main, null)); } Gives you the same result

14 LayoutInflater @Override public void onCreate(Bundle state) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onCreate(Bundle state) { super.onCreate(savedInstanceState); LayoutInflater inflater = getLayoutInflater(); setContentView( inflater.inflate(R.layout.main, null)); } Second argument is of type ViewGroup

15 LayoutInflater @Override public void onCreate(Bundle state) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onCreate(Bundle state) { super.onCreate(savedInstanceState); LayoutInflater inflater = getLayoutInflater(); setContentView( inflater.inflate(R.layout.main, null)); } Use it if you want to embed the first argument into the second argument

16 Fragments

17 Fragments A Fragment represents a behavior or a portion of user interface in an Activity. Add multiple fragments to a screen to avoid switching activities Fragments have their own lifecycle, state, and back stack Fragments require API Level 11 or greater

18 Fragments - Lifecycle A fragment must always be embedded in an activity and the fragment's lifecycle is directly affected by the host activity's lifecycle. nts/fragments.html onCreateView() is the one we'll be focusing on for now ...

19 Fragments - Steps for Creating One
You must create a subclass of Fragment Fragment, ListFragment, etc You must implement onCreateView() onCreateView() must return a View public View onCreateView( /* required args */)

20 Fragments - onCreateView()
There are two ways to return a view in your implementation of onCreateView()

21 Fragments - onCreateView()
1. Use the LayoutInflater argument to instantiate a predefined layout XML file e.g. public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { return inflater.inflate(R.layout.example_fragment, container, false); }

22 Fragments - onCreateView()
1. Use the LayoutInflater argument to instantiate a predefined layout XML file e.g. public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { return inflater.inflate(R.layout.example_fragment, container, false); } extend Fragment, not Activity

23 Fragments - onCreateView()
1. Use the LayoutInflater argument to instantiate a predefined layout XML file e.g. public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { return inflater.inflate(R.layout.example_fragment, container, false); } The XML layout file to instantiate

24 Fragments - onCreateView()
1. Use the LayoutInflater argument to instantiate a predefined layout XML file e.g. public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { return inflater.inflate(R.layout.example_fragment, container, false); } The ViewGroup to insert it into

25 Fragments - onCreateView()
1. Use the LayoutInflater argument to instantiate a predefined layout XML file e.g. public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { return inflater.inflate(R.layout.example_fragment, container, false); } Passing true would create a redundant ViewGroup, so pass false for now

26 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; }

27 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; } You've seen most of this before!

28 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; } Last time we used the keyword this to get the Context

29 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; } Since we're in a Fragment here, and not an Activity ...

30 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; } We can get the controlling Activity from within the Fragment using getActivity()

31 Fragments - onCreateView()
2. Build a UI dynamically and return the root View public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { ScrollView scroller = new ScrollView(getActivity()); TextView text = new TextView(getActivity()); scroller.addView(text); text.setText("Sample Text"); return scroller; } This is how we get the Context. Alternatively, we can say getActivity().getApplicationContext()

32 Fragments - Adding a Fragment
There are 2 ways to add a Fragment FragmentTransitionExample

33 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="edu.fsu.cs.mobile.example.MyFragment" android:tag="list_fragment" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:name="edu.fsu.cs.mobile.example.MyOtherFragment" android:tag="viewer_fragment" android:layout_weight="2" </LinearLayout>

34 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="edu.fsu.cs.mobile.example.MyFragment" android:tag="list_fragment" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:name="edu.fsu.cs.mobile.example.MyOtherFragment" android:tag="viewer_fragment" android:layout_weight="2" </LinearLayout> <fragment>

35 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="edu.fsu.cs.mobile.example.MyFragment" android:tag="list_fragment" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:name="edu.fsu.cs.mobile.example.MyOtherFragment" android:tag="viewer_fragment" android:layout_weight="2" </LinearLayout> absolute reference to your Fragment class, which includes the package name

36 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="edu.fsu.cs.mobile.example.MyFragment" android:tag="list_fragment" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:name="edu.fsu.cs.mobile.example.MyOtherFragment" android:tag="viewer_fragment" android:layout_weight="2" </LinearLayout> Fragment id

37 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="edu.fsu.cs.mobile.example.MyFragment" android:tag="list_fragment" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:name="edu.fsu.cs.mobile.example.MyOtherFragment" android:tag="viewer_fragment" android:layout_weight="2" </LinearLayout> Fragment TAG

38 Fragments - Adding a Fragment
1. Declare the Fragment inside of the Activity's layout file This works because you return a View object in your onCreateView() method for the specified Fragment The View then gets embedded into the UI

39 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_height="wrap_content" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> Use a FrameLayout as a container for your Fragment

40 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_height="wrap_content" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> Remember the id of the container ...

41 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_height="wrap_content" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> This is main.xml layout file

42 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); }

43 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } This XML layout file contains the FrameLayout container

44 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } FragmentManager allows you to interact with Fragments that are in an Activity

45 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } FragmentTransaction allows you to perform operations on Fragments (add, remove, replace)

46 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } Our Fragment doesn't exist at this point (was not specified in XML), let's create an instance of it

47 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } Add our Fragment to the FrameLayout container

48 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } The unique TAG for your Fragment, so that you can reference it later

49 Fragments - Adding a Fragment
2. Programmatically add the Fragment to an existing ViewGroup public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } Update the UI

50 Fragments - Passing data to
You will often want to pass data from your Activity to your Fragment. You can do this several ways. From within the Activity ... public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.main); MyFragment fragment = new MyFragment(); fragment.my_custom_field = value; fragment.setMyCustomField(value); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); }

51 Fragments - Passing data to
You will often want to pass data from your Activity to your Fragment. You can do this several ways. From within the Activity ...

52 Fragments - Passing data to
You will often want to pass data from your Activity to your Fragment. You can do this several ways. From within the Activity ... public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.main); MyFragment fragment = new MyFragment(); fragment.my_custom_field = value; fragment.setMyCustomField(value); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } You will need to have my_custom_field as a public field in your Fragment, and setMyCustomField() as a public method

53 Fragments - Passing data to
Alternatively, you can use Fragments setArguments(Bundle) and getArguments() methods.

54 Fragments - Passing data to
Alternatively, you can use Fragments setArguments(Bundle) and getArguments() methods. public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.main); MyFragment fragment = new MyFragment(); Bundle extras = new Bundle(); extras.putInt("selected",15); fragment.setArguments(extras); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); }

55 Fragments - Passing data to
Alternatively, you can use Fragments setArguments(Bundle) and getArguments() methods. public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.main); MyFragment fragment = new MyFragment(); Bundle extras = new Bundle(); extras.putInt("selected",15); fragment.setArguments(extras); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } You've seen Bundle before!

56 Fragments - Passing data to
Alternatively, you can use Fragments setArguments(Bundle) and getArguments() methods. public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.main); MyFragment fragment = new MyFragment(); Bundle extras = new Bundle(); extras.putInt("selected",15); fragment.setArguments(extras); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.add(R.id.fragment_container, fragment, "my_fragment"); trans.commit(); } setArguments() takes a Bundle as an argument. This is a standard Fragment method

57 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments()

58 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state);

59 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state); Bundle args and Bundle state are two separate Bundles. Ignore Bundle state for now

60 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state); get the arguments that were passed by the Activity

61 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state); onCreateView must return a View

62 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state); You may need to get the arguments at this point in the Lifecycle instead

63 Fragments - Passing data to
Then, in your Fragment, you can get the arguments using getArguments() public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { Bundle args = getArguments(); ... return new TextView(getActivity()); } public void onActivityCreated(Bundle state) { super.onActivityCreated(state); This is usually if you extended ListFragment instead

64 Fragments - How to Reference
A Fragment is not a View! You can't call findViewById() in order to reference a Fragment within an Activity use getFragmentManager().findFragmentById() or getFragmentManager().findFragmentByTag() instead of course, an instance of your Fragment Manager needs to already be a part of your Activity FragmentManager manager = getFragmentManager(); MyFragment fragment = (MyFragment) manager.findFragmentById(R.id.fragment_id); MyFragment fragment = (MyFragment) manager.findFragmentByTag("my_fragment");

65 Fragments - Removing a Fragment
You can also remove Fragments from the UI

66 Fragments - Removing a Fragment
You can also replace one Fragment with another public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = manager.findFragmentById(R.id.my_fragment); trans.remove(fragment); trans.commit(); }

67 Fragments - Removing a Fragment
You can also replace one Fragment with another public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = manager.findFragmentById(R.id.my_fragment); trans.remove(fragment); trans.commit(); } You can only remove it if it was added somehow. This gets a reference to a Fragment that was already added.

68 Fragments - Removing a Fragment
You can also replace one Fragment with another public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = manager.findFragmentById(R.id.my_fragment); trans.remove(fragment); trans.commit(); } Remove the Fragment from this Activity

69 Fragments - Replacing a Fragment
You can replace a Fragment by removing an existing Fragment and adding an new one. But an easier way to do this is to call replace() instead

70 Fragments - Replacing a Fragment
You can also replace Fragments public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.replace(R.id.fragment_container, fragment); trans.commit(); }

71 Fragments - Replacing a Fragment
You can also replace Fragments public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.replace(R.id.fragment_container, fragment); trans.commit(); } Reference the Fragment (if you don't already have a reference to it)

72 Fragments - Replacing a Fragment
You can also replace Fragments public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager manager = getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); MyFragment fragment = new MyFragment(); trans.replace(R.id.fragment_container, fragment); trans.commit(); } Remove Fragment from the Activity

73 Fragments - Reference the Activity
You can reference the controlling Activity from within the Fragment e.g, in the onCreateView() method of the Fragment class: View listView = getActivity().findViewById(R.id.list); FragmentActivityReference

74 Permissions no application, by default, has permission to perform any operations that would adversely impact other applications the operating system the user How does the system know that this app uses these permissions? PermissionsExample

75 Using Permissions Permissions requested by your application must be specified in the Android Manifest file. For example, here we request permission to access the Internet <manifest xmlns:android=" package="com.android.app.myapp" > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>

76 How to Request Permissions
Your app doesn't request to use any permissions by default To request to use a permission Open AndroidManifest.xml Click the Permissions tab at the bottom of the Editor Click Add ... Select Uses Permission Select the permission you want to request from the drop-down list Save AndroidManifest.xml

77 Permissions - WebView Example
A WebView is a View that allows you to load and display web page content to the user

78 Permissions - WebView Example
@Override public void onCreate(Bundle savedInstanceState) { WebView webview = (WebView) findViewById(R.id.webView1); webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); webview.loadUrl(" Of course, this is in our XML layout file somewhere

79 Permissions - WebView Example
@Override public void onCreate(Bundle savedInstanceState) { WebView webview = (WebView) findViewById(R.id.webView1); webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); webview.loadUrl(" This block of code prevents the system from opening the URL in the default browser

80 Permissions - WebView Example
@Override public void onCreate(Bundle savedInstanceState) { WebView webview = (WebView) findViewById(R.id.webView1); webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); webview.loadUrl(" It has to return false, in order to load the URL in our webview instead of the default browser

81 Permissions - WebView Example
@Override public void onCreate(Bundle savedInstanceState) { WebView webview = (WebView) findViewById(R.id.webView1); webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); webview.loadUrl(" The WebView will not load the URL if you don't have INTERNET permissions!, i.e. android.permissions.INTERNET

82 Permissions There are many more permissions that can be used
You can find a list of them here

83 Android Application Components
Activity Broadcast Receiver Content Provider Service

84 Broadcast Receiver —a component that responds to system wide broadcast announcements —Incoming SMS, MMS, , phone call Battery low, Screen has turned off, or a picture was captured. —think of a Broadcast receiver as a “gateway” to the other components. intended to very little work Depending on the incoming event to the receiver, it could start a Service or Activity.

85 Broadcast Receiver To add a new Broadcast Receiver
open the AndroidManifest.xml file click on the Application tab at the bottom of the window under the Application Nodes section, click Add ... select Receiver in the Attributes for Receiver section, click on the Name* link Enter the name of your Broadcast Receiver e.g. "MyBroadcastReceiver" Finish

86 Broadcast Receiver - Manifest File
If you view AndroidManifest.xml in the XML editor, you should see something like this <receiver android:name="MyBroadcastReceiver"></receiver>

87 Broadcast Receiver Your new Broadcast Receiver file should look something like this public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { }

88 Broadcast Receiver public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } Event listener for when a broadcast has been received.

89 Broadcast Receiver public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } How do you know which broadcasts to listen for?

90 Registering BroadcastReceiver
There are two ways to register a BroadcastReceiver to listen for a broadcast 1 . Adding an <intent-filter> to the Manifest file 2. Programmatically

91 Registering BroadcastReceiver
1. To add an <intent-filter> to the Manifest and listen for a Broadcast ... Open AndroidManifest.xml and click on the Application Tab at the bottom of the Window Select your BroadcastReceiver Click Add ... Make sure "Create new element in the selected element ... " is selected, then choose Intent Filter Choose Action Select the appropriate permission in the Name drop-down list e.g. android.intent.action.TIME_SET Save AndroidManifest.xml

92 Registering BroadcastReceiver
Alternatively, if you view AndroidManifest.xml in the XML editor, you should see something like this <receiver android:name="MyBroadcastReceiver"> </receiver>

93 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> </receiver>

94 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> </receiver> Place the cursor here and press Ctrl + Space

95 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> </receiver> Select <intent-filter>

96 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> </intent-filter> </receiver>

97 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> </intent-filter> </receiver> an <intent-filter> describes what this receiver should listen for

98 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> </intent-filter> </receiver> Place the cursor here and press Ctrl + Space

99 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> </intent-filter> </receiver> Select <action/>

100 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action /> </intent-filter> </receiver> Press Ctrl + Space again

101 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action /> </intent-filter> </receiver> Select android:name

102 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name=" "/> </intent-filter> </receiver> Let's try receiving a broadcast for when the screen has been turned on

103 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name=" "/> </intent-filter> </receiver> Press Ctrl + Space again

104 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name=" "/> </intent-filter> </receiver> Select android.intent.action.TIME_SET

105 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.TIME_SET"/> </intent-filter> </receiver>

106 Registering BroadcastReceiver
We need to tell the system which broadcast(s) we want to listen for. First we need to add an <intent-filter> tag <receiver android:name="MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.TIME_SET"/> </intent-filter> </receiver>

107 Registering BroadcastReceiver
2. To register a BroadcastReceiver programmatically ...

108 Registering BroadcastReceiver
public class MainActivity extends Activity { MyBroadcastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(receiver, filter); }

109 Registering BroadcastReceiver
public class MainActivity extends Activity { MyBroadcastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(receiver, filter); } Create a new instance of your receiver

110 Registering BroadcastReceiver
public class MainActivity extends Activity { MyBroadcastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(receiver, filter); } Create an intent filter

111 Registering BroadcastReceiver
public class MainActivity extends Activity { MyBroadcastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(receiver, filter); } The receiver is now registered

112 BroadcastReceiver - onReceive()
Now let's look at our BroadcastReceiver public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); }

113 BroadcastReceiver - onReceive()
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } At this point, the broadcast has been received

114 BroadcastReceiver - onReceive()
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } Let's say we want to launch a new Activity when we receive the broadcast

115 BroadcastReceiver - onReceive()
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } And we want to show a Toast

116 BroadcastReceiver - onReceive()
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } You need to add flags to your intent this time

117 BroadcastReceiver - onReceive()
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent myIntent = new Intent(context, ActivityToBeLaunched.class); Toast.makeText( context, "Broadcast Received!", Toast.LENGTH_LONG).show(); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag

118 Unregistering BroadcastReceiver
Sometimes after you start listening for a Broadcast, you may want to STOP listening for it at some point To UNregister a BroadcastReceiver programmatically ...

119 Unregistering BroadcastReceiver
public class MainActivity extends Activity { @Override public void onPause() { unregisterReceiver(receiver); super.onPause(); }

120 Unregistering BroadcastReceiver
public class MainActivity extends Activity { @Override public void onPause() { unregisterReceiver(receiver); super.onPause(); } You will want to unregister before calling a super.onSomething() method, otherwise you may get Force Close

121 Unregistering BroadcastReceiver
If you register a BroadcastReceiver programmatically, you should unregister it before your Activity is destroyed! otherwise you will have a "leaked" receiver Please call unregisterReceiver in onPause() onStop() or onDestroy() This is important

122 Code Examples BroadcastReceiverExample SimpleFragmentUsingXml
SimpleFragmentProgrammatically FragmentActivityReferenceExample FragmentTransitionExample LayoutInflaterExample PermissionsExample ComplexFragmentsExample DynamicUiExample

123 References The Busy Coder's Guide to Android Development - Mark Murphy
Android Developers The Mobile Lab at Florida State University Code Examples


Download ppt "Mobile Programming Lecture 6"

Similar presentations


Ads by Google