本文导读:本文仅仅是学习中的遇到问题的解决方法。相关学习内容可以点击开头的链接进入,或者跳转到本文最后,有相关转载的内容。
静态Fragment遇到的异常问题 |
error inflating class fragment |
1.在新建的java文件中实现Fragment1类
public class Fragment1 extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/*记得在这里指定布局,记得不要写错了*/
return inflater.inflate(R.layout.fragement1, container, false);
}
}
2.Fragment1的布局简单如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is fragment 1"
android:textColor="#000000"
android:textSize="25sp" />
</LinearLayout>
3.main的布局文件中,要在name中引用”com.example.ihome_client.Fragment2”
<fragment
android:id="@+id/fragement2"
android:name="com.example.ihome_client.Fragment2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
4.在main.java中要记得Activity继承 FragmentActivity
5.要引用相应的包 import android.support.v4.app.FragmentActivity;
动态Fragment |
1.删除掉main.xml中与fragment相关的布局。因为是动态添加
2.main.java中为如下内容
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*得到屏幕的display*/
Display display = getWindowManager().getDefaultDisplay();
if (display.getWidth() > display.getHeight()) {//如果宽度大于高度,则是横屏
Fragment1 fragment1 = new Fragment1();
getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit();
} else {//否则是竖屏
Fragment2 fragment2 = new Fragment2();
getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment2).commit();
}
}
}
- 注意:replace(R.id.main_layout, fragment1)中的R.id.main_layout是main的xml中布局的ID,切记不要写错了!
3.动态添加步骤如下
getFragmentManager() //1.获取到FragmentManager
beginTransaction() //2.开启一个事务
replace(R.id.main_layout, fragment2)//3.向容器中加入fragement
commit() //4.提交事务
Fragment的生命周期 |
public class Fragment1 extends Fragment {
public static final String TAG = "Fragment1";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
}
运行程序时:
* onAttach方法:Fragment和Activity建立关联的时候调用。
* onCreateView方法:为Fragment加载布局时调用。
* onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
* onDestroyView方法:Fragment中的布局被移除时调用。
* onDetach方法:Fragment和Activity解除关联的时候调用。
详细内容参考文章开头的链接
Fragment的通信 |
1.同时显示2个gragment 不然在一个fragment中找不到另一个fragment中的Textview
Fragment1 fragment1 = new Fragment1();
getFragmentManager().beginTransaction().replace(R.id.linear1, fragment1).commit();
Fragment2 fragment2 = new Fragment2();
getFragmentManager().beginTransaction().replace(R.id.linear2, fragment2).commit();
2.实现一个fragment中onActivityCreated
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
button = (Button) (getActivity().findViewById(R.id.button));
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
TextView textView = (TextView) getActivity().findViewById(R.id.f1text);
Toast.makeText(getActivity(), textView.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
}
重点:在Fragment中使用getActivity()—得到关联的activity(),再通过findViewById找到关联该activity的其他控件,通过这种方法能实现Fragment之间的通信
推荐一个博客: 深入分析:Fragment与Activity交互的几种方式http://blog.youkuaiyun.com/huangyabin001/article/details/35231753