1、碎片,可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用
2、Fragment中为空会报错
3、Fragment必须有name属性,其值为Fragment子类的全路径{初始化 activity视图是会调用Fragment组件的name属性对应的Fragment 类中的onCreateView()方法加载对应视图}
4、 必须要有id/tag属性
Days17Fragment01Work
备注:四个方法
1、getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用都会返回同一个Resource对象
2、getConfiguration() 返回Configuration,Resource的方法,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
3、通过Activity的getFragmentManager()方法获得FragmentManager对象
4、通过FragmentManager对象的findFragmentById()方法获取该布局中的Fragment对象
功能:如果是横屏,则左侧有一个Fragment里设置一个ListView,点击右侧条目后,会左侧的Fragment会显示点击位置的条目所对应的内容;如果是竖屏,则初始界面只有一个Fragment里有一个ListView,点击条目后,会跳转到下一界面,下一界面中的Fragment会显示点击位置的条目所对应的内容
步骤:先在MainActivity中判断是横屏还是竖屏?
初始化Activity视图,
判断为横屏,(注意:只有横屏中有ContentFragment即展示内容的Fragment),然后设置左侧的Fragment即LeftFragment,和右侧的Fragment即ContentFragment,
判断为竖屏,只有一个Fragment即LeftFragment
需要继承Fragment;点击左侧ListView中条目后,回调条目的位置给MainActivity,(MainActivity需要实现回调接口),MainActivity通过ContentFragment是否为空判断横竖屏,
为横屏则直接设置对应条目内容给ContentFragment中的TextView,为竖屏则设置Intent传递position并跳转到ContentActivity中,获取ContentFragment和数据,并根据获得position设置对应条目内容
left.xml中为ListView布局文件
activity_main.xml横屏布局文件
<fragment
android:id="@+id/ftLeft"
android:name="com.phone1000.days17fragment01work.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/hello_world" />
<fragment
android:id="@+id/ftRight"
android:name="com.phone1000.days17fragment01work.ContentFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="@string/hello_world" />
activity_main_port.xml竖屏初始界面布局文件
<fragment
android:id="@+id/ftLeft"
android:name="com.phone1000.days17fragment01work.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/hello_world" />
**activity_content.xml**ContentActivity的布局文件
<fragment
android:id="@+id/ftContent"
android:name="com.phone1000.days17fragment01work.ContentFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
public class MainActivity extends Activity implements
IOnGetListViewItemListener {
private ContentFragment contentFragment = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用,
* 都会返回同一个Resource对象 Configuration,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
*
* Configuration.ORIENTATION_LANDSCAPE 的值为2,表示是横屏
* Configuration.ORIENTATION_PORTRAIT 的值为1,表示是竖屏
*/
// 如果是横屏
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 横屏布局包含了两个Fragment(LeftFragment,ContentFragment)的布局
/**
* 会初始化MainActivity的视图
* 会分别调用Fragment组件的name属性对应的Fragment类中的onCreateView()方法加载对应视图
* 如:(com.phone1000.days17fragment01work.LeftFragment)
* (com.phone1000.days17fragment01work.ContentFragment)
*/
setContentView(R.layout.activity_main);
/**
* getFragmentManager()是Activity的方法,返回值为FragmentManager
* findFragmentById()是FragmentManager的方法,返回值为Fragment
*/
// 只有横屏布局中才有contentFragment,
// 通过Activity的getFragmentManager()方法获得FragmentManager对象
// 再通过FragmentManager对象的findFragmentById()方法获取该布局中的ContentFragment对象
contentFragment = (ContentFragment) getFragmentManager()
.findFragmentById(R.id.ftRight);
} else {
// 如果是竖屏,仅包含了一个Fragment对象(LeftFragment)
setContentView(R.layout.activity_main_port);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 接收LeftFragment中回传的数据position
*/
@Override
public void onGetListViewItem(int position) {
//contentFragment!=null,则为横屏,
if (contentFragment != null) {
// 直接设置contentFragment中对应position的内容
contentFragment.setContent("i am " + position + "item");
} else {
//contentFragment == null ,则为竖屏
//开启新的Activity接收要显示的数据
Intent intent = new Intent(this, ContentActivity.class);
//传递position给要显示条目内容Activity
intent.putExtra("position", position);
//开启新的Activity
startActivity(intent);
}
}
}
public class LeftFragment extends Fragment {
/**
* Fragment的获取视图的方法,该方法的返回值作为当前Fragment的视图内容
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 将left.xml(包含了一个ListView的相对布局)作为当前Fragment的内容展示
View v = inflater.inflate(R.layout.left, container, false);
ListView lvShow = (ListView) v.findViewById(R.id.lvShow);
// 给当前v中的ListView构建适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_dropdown_item_1line, new String[] {
"item0", "item1", "item2", "item3" });
lvShow.setAdapter(adapter);
// 给ListView设置条目点击监听
lvShow.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 在Fragment中,可以通过getActivity()方法获取**“宿主”**Activity
Activity activity = getActivity();
// 判断“宿主”Activity是否是一个IOnGetListViewItemListener回调接口
// 由于MainActivity是宿主Activity,并且实现了IOnGetListViewItemListener接口
// 可将其强转为IOnGetListViewItemListener接口
if (activity instanceof IOnGetListViewItemListener) {
IOnGetListViewItemListener listener = (IOnGetListViewItemListener) activity;
// 通过IOnGetListViewItemListener接口对象的回调方法,将position回传给MainActivity
listener.onGetListViewItem(position);
}
}
});
return v;
}
}
public class ContentFragment extends Fragment {
private TextView txt = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// new TextView(Context)要传入一个Context对象
txt = new TextView(getActivity());
txt.setText("i am contentFragment");
return txt;
}
public void setContent(String content) {
txt.setText(content);
}
}
public class ContentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//android:name="com.phone1000.days17fragment01work.ContentFragment"
//设置(只包含了ContentFragment内容的布局)为当前Activity的内容的布局
setContentView(R.layout.activity_content);
//获得FragmentManager对象
FragmentManager manager = getFragmentManager();
//通过manager的findFragmentById()方法获取ContentFragment对象
ContentFragment contentFragment = (ContentFragment) manager
.findFragmentById(R.id.ftContent);
Intent intent = getIntent();
int position = intent.getIntExtra("position", 0);
String content = "展示"+position+"条目内容";
//给contentFragment对象设置对应position条目的内容
contentFragment.setContent(content);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.content, menu);
return true;
}
}