- 浏览: 91253 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wangyudong:
家里是拨号上网,不行的,找到了一个Holer工具,只需要配置一 ...
【如何通过广域网访问局域网的服务器?】 -
叮咚可乐名:
大数据就是这么任性第一季数据结构和算法http://pan.b ...
数据结构与算法-简介 -
戢_时光:
...
【Java集合之二】Set集合 -
lzg406:
HTTP默认方式下,使用持久连接。 这个值得推敲
【应用层】之一:HTTP协议与FTP协议 -
mute_:
特别腻害呢
正则表达式1:概念
本文围绕以下三个部分展开:
一、Fragment 碎片 / 帧 / 片段
二、两个案例
(一)、静态 Fragment
附 代码补充
(二)、动态 Fragment
附 代码补充
一、Fragment 碎片 / 帧 / 片段
1.Fragment 碎片 / 帧 / 片段
从 android 3.0 加入 Fragment 的概念,目的是在不同类型屏幕下实现 UI 的动态和灵活设计。
由于 Fragment 有独立的生命周期及可用复用,所以在设计复杂 UI 时(Tab 导航、 ViewPager 及 抽屉导航)应用极为广泛。
创建 Activity 的时候,需要完成三步:1.XxxActivity ; 2. activity_Xxx.xml ; 3.在功能清单中注册。最后,在 Activity 之间还要实现跳转。
Fragment 是轻量级的 Activity ,不需要在功能清单中注册。
2.Fragment 生命周期
3.Fragment 相关类
(1)android.app.Fragment
(2)android.app.FragmentManager
Fragment 管理器,用于管理与当前活动关联的 Fragment .
(3)android.app.FragmentTransaction
Fragment 事务,开始一系列的 Fragment 操作。
二、两个案例
案例(一)、静态 Fragment
打开App后,默认主界面如下:
当左边点击“Android”的时候,右边碎片正中间出现“Android”:
同样,当点击其他项的时候,右边碎片正中间出现对应的内容:
(1)创建 碎片 : LeftFragment & fragment_left.xml , RightFragment & fragment_right.xml 。
(2)写两个碎片的内容。
fragment_left.xml:一个ListView。
fragment_right.xml:一个TextView。默认界面是在正中间显示本app的名字:“StaticFragment”。
(3)写主布局文件:activity_main.xml。
(4)主活动:MainActivity 。创建的时候,就会有以下代码:
(5)LeftFragment。调用 onAttach() 方法:在 Fragment 与 Activity 关联时。
代码说明:
主活动要实现此碎片中定义的内部接口:
(6)LeftFragment。调用 onCreate() 方法:创建 Fragment 时调用,主要用来初始化数据(准备好要用的数据)。
(7)LeftFragment。调用 onCreateView() 方法:画界面。
代码说明:
simple_list_item_1 :有一个控件。一次只显示一行。
simple_list_item_2 :有两个控件。一次显示二行。
simple_list_item_activated_1 : 有一个控件。当选项选中时,背景色改变(即为激活状态)
simple_list_item_activated_2 : 有两个控件。当选项选中时,背景色改变(即为激活状态)
(8)MainActivity。获得碎片管理器,管理两个碎片。
(9)LeftFragment。写此碎片的事件处理方法:点击选项的事件。
代码说明:
此处,通过 callback 这个 MainActivity的实例,主布局已经获得了左边碎片要传递的值:text 。
Fragment 实现 AdapterView.OnItemClickListener 接口:
(10)MainActivity。主布局要获得 左边的碎片 中的数据(通过调用 LeftFragment 内部接口定义的回调方法,获得 LeftFragment 中点击选项的文本)
其中, LeftFragment 内部接口定义的回调方法如下:
代码说明:
此处,通过 rightFragment 这个 右边碎片的对象,来调用 右边碎片的displayContent()方法,右边碎片就获得了左边碎片传递给主布局的值:text。
(11)RightFragment。右边的碎片 从主布局中已经获得了数据,在此定义 displayContent() 方法,让数据(文本:text)在右边碎片界面上面显示。
附 代码补充
1. fragment_left.xml
2. fragment_right.xml
3. activity_main.xml
4. MainActivity
5. LeftFragment
6. RightFragment
案例(二)、动态 Fragment
打开app后,默认加载的是“聊天”界面:
当点击“聊天”按钮的时候,加载“聊天”界面,“聊天”字体变绿:
当点击“联系人”按钮的时候,加载“联系人”界面,“联系人”字体变绿:
当点击“朋友圈”按钮的时候,加载“朋友圈”界面,“朋友圈”字体变绿:
(1)修改 activity_main.xml 。
(3)创建三个碎片: ChatFragment & fragment_chat.xml,ContactFragment & fragment_contact.xml,DiscoverFragment & fragment_discover.xml 。并在三个碎片的布局文件中填入内容。
(4)修改 MainActivity 。
附 代码补充
1. strings.xml
2. activity_main.xml
3. 三个碎片的布局文件
4. MainActivity
一、Fragment 碎片 / 帧 / 片段
二、两个案例
(一)、静态 Fragment
附 代码补充
(二)、动态 Fragment
附 代码补充
一、Fragment 碎片 / 帧 / 片段
1.Fragment 碎片 / 帧 / 片段
从 android 3.0 加入 Fragment 的概念,目的是在不同类型屏幕下实现 UI 的动态和灵活设计。
由于 Fragment 有独立的生命周期及可用复用,所以在设计复杂 UI 时(Tab 导航、 ViewPager 及 抽屉导航)应用极为广泛。
创建 Activity 的时候,需要完成三步:1.XxxActivity ; 2. activity_Xxx.xml ; 3.在功能清单中注册。最后,在 Activity 之间还要实现跳转。
Fragment 是轻量级的 Activity ,不需要在功能清单中注册。
2.Fragment 生命周期
3.Fragment 相关类
(1)android.app.Fragment
(2)android.app.FragmentManager
Fragment 管理器,用于管理与当前活动关联的 Fragment .
(3)android.app.FragmentTransaction
Fragment 事务,开始一系列的 Fragment 操作。
二、两个案例
案例(一)、静态 Fragment
打开App后,默认主界面如下:
当左边点击“Android”的时候,右边碎片正中间出现“Android”:
同样,当点击其他项的时候,右边碎片正中间出现对应的内容:
(1)创建 碎片 : LeftFragment & fragment_left.xml , RightFragment & fragment_right.xml 。
(2)写两个碎片的内容。
fragment_left.xml:一个ListView。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.xiangdong.staticfragment.LeftFragment"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </FrameLayout>
fragment_right.xml:一个TextView。默认界面是在正中间显示本app的名字:“StaticFragment”。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light" tools:context="com.xiangdong.staticfragment.RightFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textAppearance="?android:attr/textAppearanceLarge" android:text="@string/app_name" android:textColor="@android:color/white"/> </RelativeLayout> <!-- 代码说明: (1)因为这两个碎片都会被调用,因此都要写 id。 (2)android:background="@android:color/holo_blue_light" 设置背景色为:浅蓝色。 (3)android:textAppearance="?android:attr/textAppearanceLarge" 一种大字体的格式。 -->
(3)写主布局文件:activity_main.xml。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <!-- 主界面上,显示两个 碎片(帧/片段) 界面 --> <fragment android:id="@+id/leftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.xiangdong.staticfragment.LeftFragment" tools:layout="@layout/fragment_left"/> <fragment android:id="@+id/rightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.xiangdong.staticfragment.RightFragment" tools:layout="@layout/fragment_right"/> </LinearLayout> <!-- 代码说明: (1)主布局文件上,左右各放一个碎片,因此用 LinearLayout,方向需设为 水平。 android:orientation="horizontal" (2)android:name="com.xiangdong.staticfragment.LeftFragment" 主布局文件 与 LeftFragment 关联。 tools:layout="@layout/fragment_left" 主布局文件 与 fragment_left 关联。 -->
(4)主活动:MainActivity 。创建的时候,就会有以下代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载主布局文件,就会加载两个碎片界面。(在配置文件中,布局文件与Activity关联了) setContentView(R.layout.activity_main); }
(5)LeftFragment。调用 onAttach() 方法:在 Fragment 与 Activity 关联时。
/** * Fragment 与 Activity 关联时调用 * @param activity */ @Override public void onAttach(Activity activity) { // 2. 关联时,会调用这个方法 super.onAttach(activity); // 获得活动的引用 if(activity instanceof OnFragmentListener){ // 2.1 活动实现了监听器,即可回调活动中的方法 callback = (OnFragmentListener) activity; } } //-----Fragment 与 Activity 传递参数------------------------------------ private OnFragmentListener callback; }
代码说明:
主活动要实现此碎片中定义的内部接口:
public class MainActivity extends Activity implements LeftFragment.OnFragmentListener{}
(6)LeftFragment。调用 onCreate() 方法:创建 Fragment 时调用,主要用来初始化数据(准备好要用的数据)。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); data = new ArrayList<>(); data.add("Android"); data.add("IOS"); data.add("Web"); data.add("C"); data.add("C#"); data.add("C++"); }
(7)LeftFragment。调用 onCreateView() 方法:画界面。
// 加载 Fragment 视图 (界面出来了) @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment 填充指定布局文件 View view = inflater.inflate(R.layout.fragment_left, container, false); adapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, data); listView = (ListView) view.findViewById(R.id.listView); listView.setAdapter(adapter); // 注册监听事件:设置当前(我自己)即可。 listView.setOnItemClickListener(this); return view; }
代码说明:
simple_list_item_1 :有一个控件。一次只显示一行。
simple_list_item_2 :有两个控件。一次显示二行。
simple_list_item_activated_1 : 有一个控件。当选项选中时,背景色改变(即为激活状态)
simple_list_item_activated_2 : 有两个控件。当选项选中时,背景色改变(即为激活状态)
(8)MainActivity。获得碎片管理器,管理两个碎片。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获得 Fragment 管理器 (这两个碎片都被 MainActivity管了) FragmentManager fm = this.getFragmentManager(); leftFragment = (LeftFragment)fm.findFragmentById(R.id.leftFragment); rightFragment = (RightFragment) fm.findFragmentById(R.id.rightFragment); }
(9)LeftFragment。写此碎片的事件处理方法:点击选项的事件。
/** * Fragment 中的事件处理方法 * @param parent * @param view * @param position * @param id */ // 在 Fragment 中点击选项 (Fragment 要先实现 AdapterView.OnItemClickListener 接口) @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击的文本 :要传给Activity String text = data.get(position); // 调用回调(Activity)中的方法 // callback 是 MainActivity的实例,因此它做事情,就是在 MainActivity 中做事情 callback.onItemClick(text); }
代码说明:
此处,通过 callback 这个 MainActivity的实例,主布局已经获得了左边碎片要传递的值:text 。
Fragment 实现 AdapterView.OnItemClickListener 接口:
public class LeftFragment extends Fragment implements AdapterView.OnItemClickListener{}
(10)MainActivity。主布局要获得 左边的碎片 中的数据(通过调用 LeftFragment 内部接口定义的回调方法,获得 LeftFragment 中点击选项的文本)
/** * LeftFragment 内部接口定义的回调方法 * @param text */ @Override public void onItemClick(String text) { // 获得 LeftFragment 中点击的选项的文本 rightFragment.displayContent(text); }
其中, LeftFragment 内部接口定义的回调方法如下:
//-----Fragment 与 Activity 传递参数------------------------------------ private OnFragmentListener callback; /** * 从 Fragment 往 Activity 传递数据 : 通过调用内部的接口去传。 * 1. 在 Fragment 中定义接口 (内部接口) * 2. Activity 实现 Fragment 中定义的接口 */ interface OnFragmentListener { // 点击当前 Fragment 中控件,回调的方法 void onItemClick(String text); }
代码说明:
此处,通过 rightFragment 这个 右边碎片的对象,来调用 右边碎片的displayContent()方法,右边碎片就获得了左边碎片传递给主布局的值:text。
(11)RightFragment。右边的碎片 从主布局中已经获得了数据,在此定义 displayContent() 方法,让数据(文本:text)在右边碎片界面上面显示。
// 让文字在控件上面显示 public void displayContent(String text){ // 显示文本 tvContent.setText(text); }
附 代码补充
1. fragment_left.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.xiangdong.staticfragment.LeftFragment"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </FrameLayout>
2. fragment_right.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light" tools:context="com.xiangdong.staticfragment.RightFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textAppearance="?android:attr/textAppearanceLarge" android:text="@string/app_name" android:textColor="@android:color/white"/> </RelativeLayout>
3. activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <!--fragment:是类型。 主界面上,显示两个 碎片(帧/片段) 界面 --> <fragment android:id="@+id/leftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.xiangdong.staticfragment.LeftFragment" tools:layout="@layout/fragment_left"/> <fragment android:id="@+id/rightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.xiangdong.staticfragment.RightFragment" tools:layout="@layout/fragment_right"/> </LinearLayout>
4. MainActivity
package com.xiangdong.staticfragment; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; /** * Activity 实现 Fragment 中定义的接口 */ public class MainActivity extends Activity implements LeftFragment.OnFragmentListener { private LeftFragment leftFragment; private RightFragment rightFragment; /** * LeftFragment 内部接口定义的回调方法 * * @param text */ @Override public void onItemClick(String text) { // 7. 获得 LeftFragment 中点击的选项的文本 rightFragment.displayContent(text); } @Override protected void onCreate(Bundle savedInstanceState) { Log.v("FRAGMENT", "activity.onCreate............"); super.onCreate(savedInstanceState); // 1. 加载主布局文件,就会加载两个碎片界面。(在配置文件中,布局文件与Activity关联了) setContentView(R.layout.activity_main); // 5. 获得 Fragment 管理器 (这两个碎片都被 MainActivity管了) FragmentManager fm = this.getFragmentManager(); leftFragment = (LeftFragment) fm.findFragmentById(R.id.leftFragment); rightFragment = (RightFragment) fm.findFragmentById(R.id.rightFragment); } //---------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
5. LeftFragment
package com.xiangdong.staticfragment; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class LeftFragment extends Fragment implements AdapterView.OnItemClickListener{ private static final String TAG = "FRAGMENT"; private ListView listView; private List<String> data; private ArrayAdapter<String> adapter; // 3. 创建 Fragment 时调用,主要用来初始化数据(准备好要用的数据) @Override public void onCreate(Bundle savedInstanceState) { Log.v(TAG,"onCreate............"); super.onCreate(savedInstanceState); data = new ArrayList<>(); data.add("Android"); data.add("IOS"); data.add("Web"); data.add("C"); data.add("C#"); data.add("C++"); } // 4.加载 Fragment 视图 (界面出来了) @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 附件:看 Fragment 生命周期 Log.v(TAG,"onCreateView............"); // Inflate the layout for this fragment 填充指定布局文件 View view = inflater.inflate(R.layout.fragment_left, container, false); // simple_list_item_1:一次只显示一行文字 adapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, data); listView = (ListView) view.findViewById(R.id.listView); listView.setAdapter(adapter); // 注册监听事件:设置当前(我自己)即可。 listView.setOnItemClickListener(this); return view; } // AdapterView.OnItemClickListener :实现的接口 /** * Fragment 中的事件处理方法 * @param parent * @param view * @param position * @param id */ // 6. 在 Fragment 中点击选项 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击的文本 :要传给Activity String text = data.get(position); // 调用回调(Activity)中的方法 // 6.1 callback 是 MainActivity的实例,因此它做事情,就是在 MainActivity 中做事情 callback.onItemClick(text); } /** * Fragment 与 Activity 关联时调用 * @param activity */ @Override public void onAttach(Activity activity) { Log.v(TAG, "onAttach............"); // 2. 关联时,会调用这个方法 super.onAttach(activity); // 获得活动的引用 if(activity instanceof OnFragmentListener){ // 2.1 活动实现了监听器,即可回调活动中的方法 callback = (OnFragmentListener) activity; } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.v(TAG, "onActivityCreated............"); } //-----Fragment 与 Activity 传递参数------------------------------------ private OnFragmentListener callback; /** * 从 Fragment 往 Activity 传递数据 : 通过调用内部的接口去传。 * 1. 在 Fragment 中定义接口 (内部接口) * 2. Activity 实现 Fragment 中定义的接口 */ interface OnFragmentListener { // 点击当前 Fragment 中控件,回调的方法 void onItemClick(String text); } }
6. RightFragment
package com.xiangdong.staticfragment; import android.os.Bundle; import android.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class RightFragment extends Fragment { private TextView tvContent; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment 填充指定布局文件 View view = inflater.inflate(R.layout.fragment_right, container, false); tvContent = (TextView) view.findViewById(R.id.tvContent); return view; } // 让文字在控件上面显示 public void displayContent(String text){ // 8. 显示文本 tvContent.setText(text); } }
案例(二)、动态 Fragment
打开app后,默认加载的是“聊天”界面:
当点击“聊天”按钮的时候,加载“聊天”界面,“聊天”字体变绿:
当点击“联系人”按钮的时候,加载“联系人”界面,“联系人”字体变绿:
当点击“朋友圈”按钮的时候,加载“朋友圈”界面,“朋友圈”字体变绿:
(1)修改 activity_main.xml 。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <LinearLayout android:id="@+id/headLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btnChat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/chat" android:layout_weight="1" style="@android:style/Widget.Material.Button.Borderless"/> <Button android:id="@+id/btnContact" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/contact" android:layout_weight="1" style="@android:style/Widget.Material.Button.Borderless"/> <Button android:id="@+id/btnDiscover" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/discover" android:layout_weight="1" style="@android:style/Widget.Material.Button.Borderless"/> </LinearLayout> <LinearLayout android:id="@+id/contentLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/headLayout" android:orientation="horizontal"> </LinearLayout> </RelativeLayout>
(3)创建三个碎片: ChatFragment & fragment_chat.xml,ContactFragment & fragment_contact.xml,DiscoverFragment & fragment_discover.xml 。并在三个碎片的布局文件中填入内容。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.dynamicfragment.ChatFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/chat"/> </FrameLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.dynamicfragment.ContactFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/contact"/> </FrameLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.dynamicfragment.DiscoverFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/discover"/> </FrameLayout>
(4)修改 MainActivity 。
// 声明变量 private FragmentTransaction ft; // 事务 private FragmentManager fm; private Button btnChat; private Button btnContact; private Button btnDiscover; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnChat = (Button) findViewById(R.id.btnChat); btnContact = (Button) findViewById(R.id.btnContact); btnDiscover = (Button) findViewById(R.id.btnDiscover); // 获得 Fragment 管理器 fm = this.getFragmentManager(); // 开启事务 ft = fm.beginTransaction(); // 使用 Fragment 替换原来的界面(替换contentLayout:原来定义的线性布局。) ft.replace(R.id.contentLayout,new ChatFragment()); // 提交事务 ft.commit(); } /** * 动态 Fragment:点击了谁,下面就显示相应的界面。 * 并没有涉及 碎片之间传递数据(静态 Fragment),因此更简单些。 * @param view */ public void onClick(View view){ // 开启事务 ft = fm.beginTransaction(); // 动态体现在这儿 switch (view.getId()){ case R.id.btnChat: // 使用 Fragment 替换原来的界面(替换contentLayout:原来定义的线性布局。) ft.replace(R.id.contentLayout,new ChatFragment()); btnChat.setTextColor(Color.GREEN); btnContact.setTextColor(Color.BLACK); btnDiscover.setTextColor(Color.BLACK); break; case R.id.btnContact: ft.replace(R.id.contentLayout,new ContactFragment()); btnChat.setTextColor(Color.BLACK); btnContact.setTextColor(Color.GREEN); btnDiscover.setTextColor(Color.BLACK); break; case R.id.btnDiscover: ft.replace(R.id.contentLayout,new DiscoverFragment()); btnChat.setTextColor(Color.BLACK); btnContact.setTextColor(Color.BLACK); btnDiscover.setTextColor(Color.GREEN); break; } // 提交事务 ft.commit(); }
附 代码补充
1. strings.xml
<resources> <string name="app_name">DynamicFragment</string> <string name="action_settings">Settings</string> <string name="chat">聊天</string> <string name="contact">联系人</string> <string name="discover">朋友圈</string> </resources>
2. activity_main.xml
3. 三个碎片的布局文件
4. MainActivity
package com.xiangdong.dynamicfragment; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { // 动态 Fragment 步骤: // 1. 新建 Module // 2. 修改 activity_main.xml // 3. 创建 XxxFragment 和 fragment_Xxx.xml // 4. 修改 MainActivity // 4.1 声明变量 private FragmentTransaction ft; // 事务 private FragmentManager fm; private Button btnChat; private Button btnContact; private Button btnDiscover; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnChat = (Button) findViewById(R.id.btnChat); btnContact = (Button) findViewById(R.id.btnContact); btnDiscover = (Button) findViewById(R.id.btnDiscover); // 4.2 获得 Fragment 管理器 fm = this.getFragmentManager(); // 4.3 开启事务 ft = fm.beginTransaction(); // 4.4 使用 Fragment 替换原来的界面(替换contentLayout:原来定义的线性布局。) ft.replace(R.id.contentLayout,new ChatFragment()); // 4.5 提交事务 ft.commit(); } /** * 动态 Fragment:点击了谁,下面就显示相应的界面。 * 并没有涉及 碎片之间传递数据(静态 Fragment),因此更简单些。 * @param view */ public void onClick(View view){ // 4.3 开启事务 ft = fm.beginTransaction(); // 动态体现在这儿 switch (view.getId()){ case R.id.btnChat: // 4.4 使用 Fragment 替换原来的界面(替换contentLayout:原来定义的线性布局。) ft.replace(R.id.contentLayout,new ChatFragment()); btnChat.setTextColor(Color.GREEN); btnContact.setTextColor(Color.BLACK); btnDiscover.setTextColor(Color.BLACK); break; case R.id.btnContact: ft.replace(R.id.contentLayout,new ContactFragment()); btnChat.setTextColor(Color.BLACK); btnContact.setTextColor(Color.GREEN); btnDiscover.setTextColor(Color.BLACK); break; case R.id.btnDiscover: ft.replace(R.id.contentLayout,new DiscoverFragment()); btnChat.setTextColor(Color.BLACK); btnContact.setTextColor(Color.BLACK); btnDiscover.setTextColor(Color.GREEN); break; } // 4.5 提交事务 ft.commit(); } //------------------------------------------------------------------------ @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
发表评论
-
【攻克Android (43)】WebView (网络视图)
2015-09-09 22:15 1252本文围绕以下两个部分展开: 一、WebView WebVi ... -
WebView (网络视图)
2015-09-09 22:12 0本文围绕以下两个部分展开: 一、WebView WebVi ... -
【攻克Android (41)】HttpURLConnection
2015-09-08 17:43 1361本文围绕以下三个部分展开: 一、HttpURLConnec ... -
HttpURLConnection
2015-09-08 17:42 0本文围绕以下三个部分展开: 一、HttpURLConnec ... -
【攻克Android (40)】JSON解析
2015-09-07 20:49 1273本文围绕以下三个部分 ... -
JSON解析
2015-09-07 20:47 0本文围绕以下三个部分 ... -
【攻克Android (39):XML解析之四】Simple方式解析XML
2015-08-27 18:38 1750本文围绕以下三个部分 ... -
【攻克Android (38):XML解析之三】Pull方式解析XML
2015-08-27 09:25 1736本文围绕以下两个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (37):XML解析之二】SAX方式解析XML
2015-08-26 15:15 875本文围绕以下两个部分展开: 一、SAX解析 案例一 ... -
【XML解析之一】SAX方式解析XML
2015-08-26 02:58 0本文围绕以下四个部分展开: 一、SAX解析 案例一 ... -
【攻克Android (36):XML解析之一】DOM方式解析XML
2015-08-26 00:27 946本文围绕以下三个部分展开: 一、XML概述 二、DOM解析 ... -
DOM方式解析XML案例
2015-08-26 00:26 0本文围绕以下四个部分展开: 一、DOM解析 案例一 ... -
【XML解析之四】Simple方式解析XML
2015-08-27 18:36 0本文围绕以下三个部分 ... -
【XML解析之一】Pull方式解析XML
2015-08-26 02:56 0本文围绕以下四个部分展开: 一、Pull解析 案例一:P ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:22 885本文围绕以下四个部分 ... -
【攻克Android (22)】View/Tween Animation 视图动画(补间动画)
2015-08-25 21:21 0本文围绕以下四个部分 ... -
【攻克Android (45)】四大组件之 ContentProvider
2015-08-18 16:24 1116本文围绕以下两个部分展开: 一、ContentProvide ... -
【攻克Android (32)】Notification 通知
2015-08-17 19:57 952本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
Notification 通知
2015-08-17 19:56 0本文围绕以下两个部分展开: 一、通知 案例一 一 ... -
BroadcastReceiver完整版
2015-08-17 13:15 0本文围绕以下四个部分展开: 一、广播 案例一:系统广播(属于 ...
相关推荐
Android Studio 动态加载 Fragment 和获取实例的方法 Android Studio 是一个功能强大的集成开发环境(IDE),它提供了许多实用的功能和工具来帮助开发者快速构建高质量的 Android 应用程序。在 Android 开发中,...
Android Fragment(碎片)应用Demo(开发工具Android Studio),主要代码: AnotherRightFragment fragment = new AnotherRightFragment(); FragmentManager fragmentManager = getFragmentManager(); ...
在Android应用开发中,Fragment是UI组件的一种,它允许我们构建可重用的模块化界面。Fragment可以在Activity中动态添加、删除或替换,这在设计适应不同屏幕尺寸和配置的应用时非常有用。当我们想要增强用户体验,使...
在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、删除或替换。Fragment提供了在不同屏幕尺寸和配置变化下管理用户界面的能力。本教程将深入探讨如何在Android应用程序中实现...
在Android应用开发中,Fragment是UI组件的一种,用于在大屏幕设备上实现多屏或复合视图。Fragment可以在Activity之间动态地添加、移除或替换,使得应用在不同屏幕尺寸和配置下都能提供良好的用户体验。"Android ...
Fragment的概念是从Android3.0开始引入的,直译为碎片、片段,目的是为不同屏幕大小的设备(手机、平板等)创建灵活动态的UI。诚如其名,你可以把Fragment当作是Activity的模块化组件,它拥有自己的生命周期和UI,接受...
"Android在Fragment中实现监听触摸事件" Android在Fragment中实现监听触摸事件是指在Android应用程序中,如何在Fragment中监听触摸事件。Fragment是Android应用程序中的一个组件,它可以在Activity中使用,但是它并...
在Android应用开发中,Fragment是UI组件的重要组成部分,它允许我们构建可重用、模块化的界面。本教程将深入探讨如何在首页实现Fragment的切换,主要介绍两种常见方法:Fragment的显示与隐藏以及通过ViewPager进行...
在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在单个Activity中实现多个可交互的屏幕区域。Fragment的设计使得应用可以更好地适应不同的屏幕尺寸和配置,如手机和平板。本教程将深入讲解...
在Android应用开发中,Fragment是UI组件的重要组成部分,它允许我们构建可动态组合的应用界面,尤其是在平板电脑等大屏幕设备上。本文将深入探讨Fragment的管理以及如何解决Fragment重叠问题。 首先,Fragment是在...
在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持多屏幕适配和复杂的用户界面设计。在Android Studio中,Fragment是应用程序界面的一部分,可以独立于Activity进行部分交互,允许...
在Android应用开发中,Fragment是UI组件的一种,它允许开发者在一个Activity中添加多个"子界面",从而实现更复杂的布局和交互。Fragment的设计初衷是为了更好地适应不同尺寸的屏幕,如手机和平板,使得UI能够在不同...
在Android应用开发中,Activity和Fragment是两个核心组件。Activity作为应用程序的主要入口点,而Fragment则作为可重用的UI块,可以在多个Activity之间切换或组合。然而,在使用Fragment时,有时会出现一个问题:当...
在Android应用开发中,尤其是针对平板电脑的大屏幕设计,Fragment是一个至关重要的组件。Fragment是Android 3.0(API级别11)引入的概念,旨在提供更灵活的界面设计,允许开发者将用户界面拆分为可独立操作的部分。...
在Android应用开发中,Fragment是UI组件的重要组成部分,它允许我们构建可复用、模块化的用户界面。然而,开发者在使用Fragment时可能会遇到一个常见问题:Fragment重叠。本篇文章将深入探讨Fragment重叠的问题,并...
在Android应用开发中,Fragment是Android SDK提供的一种用于在Activity中管理多个视图组件的方式,尤其在处理大屏幕设备如平板电脑时非常有用。在移动设备上,它可以帮助我们实现更复杂的用户界面布局。本教程将详细...
在Android应用开发中,Fragment是Android SDK 3.0(API级别11)引入的一个重要组件,用于构建可重用的、模块化的用户界面部分。TabActivity曾是Android早期版本中实现标签页切换的主要方式,但随着Android API的发展...
Android 组件 Fragment 介绍 Android Fragment 是 Android 3.0 中引入的一种新的 UI 组件,旨在支持大屏幕设备上更加灵活和动态的用户界面设计。Fragment 允许开发者将 Activity 的布局分散到多个 Fragment 中,每...
android-lifecycle, Android Activity/fragment 生命周期的图表 完整的Android fragment & Activity 生命周期尝试了解各种各样的片段之后,我做了一些研究并将完整的Android Activity/fragment 生命周期结合起来。...
### Android Fragment 完全解析 #### 一、Fragment 概述与应用场景 Fragment(碎片)是一种可以在Activity中灵活地插入和删除的用户界面组件。它主要用于优化平板电脑等大屏幕设备上的用户界面,使得应用程序能够...