
什么叫子fragment。 fragment是不能包含的。另外view类的东西,最好尽量不要static引用一个activity中多个fragment通信一般通过activity做桥梁。fragment申明一个接口,activity去实现,fragment改变后通过接口通知activity,然后activity再通知另一个fragment。fragment之间最好不要有直接联系。另外,也可以用广播或者其他类似的方法实现
1对父activity附加和分离fragments分别通过onAttach和onDetach
fragment/activity
到了pause状态,onDetach是有可能不被调用就挂了,因为父activity的进程可能因为资源紧张被杀死。(意外死亡)
onAttach一般是用来获取对父activity的引用。(因为你可能需要用到父activity来初始化你的一些东西)
2创建和销毁Fragments
与activity一样,你应该使用onCreate方法去初始化你的fragments。(onCreate方法在整个生命周期只执行1次)。
注意:不像activity,fragment的ui初始化可不在onCreate方法中,而是onCreateView
如果fragment需要与父activtiy的UI交互,那么你需要等onActivityCreate方法触发才可以,因为这个方法意味着你的activity已经完整初始化好了。
3Fragment状态
再次强调,fragment的命运与activity是息息相关的。因此,fragment的状态常常要去参考activity的状态,因为要保持一致。
当activities获取到焦点,那么它所含的fragments也能获取到焦点。当activity暂停或者停止,fragments也暂停或者停止
。。。。。等等,当activity死掉了,fragment必须死。
4Fragment Manager
每个activity包含一个fragment manager去管理它所包含的fragments 你可以获取fragment
manager通过getFragmentManager方法。
FragmentManager fragmentManager = getFragmentManager()
FragmentManager提供方法去获取和使用Fragments和执行Fragment事务:增加,移除,或者代替Fragments
1增加Fragments到Activities
最简单的方式,当然XML喽,直接例子不解释了:(tag或者id是必须给一个的,便于后期查找,也便于activity重启的时候系统用来恢复)
android:orientation=”horizontal”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
android:id=”@+id/my_list_fragment”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:layout_weight=”1”
/>
android:id=”@+id/details_fragment”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:layout_weight=”3”
/>
5使用Fragment事务:
事务可以用来增加,移除,替换Fragments
使用事务可以使你的布局动态化,可以基于用户的交互和APP的状态做适应和改变。它们还支持指定显示的过渡动画和是否去包含事务在Back Stack。
使用beginTransaction一个新的Fragment事务(FragmentManager的方法)。如果需要,在你设置显示的动画前,可以使用add,remove,replace方法修改布局和设置合适的back-stack行为。当你准备好改变的时候,使用commit去提交到UI队列中。
FragmentTransaction fragmentTransaction =
fragmentManagerbeginTransaction();
// Add, remove, and/or replace Fragments
// Specify animations
// Add to back stack if required
fragmentTransactioncommit();
增加、移除或者代替Fragments:
add:
FragmentTransaction fragmentTransaction =
fragmentManagerbeginTransaction();
fragmentTransactionadd(Ridui_container, new MyListFragment());
fragmentTransactioncommit();
注意!!!:fragment没视图时,你只能指定tag(add(Fragment fg,String
tag)),如果有视图,tag和id都可以。
首先必须明白,既然是动态添加的,我怎么知道该加到布局的哪部分,所以这里要指定父布局容器的ID,Ridui_container。
remove:
FragmentTransaction fragmentTransaction =
fragmentManagerbeginTransaction();
Fragment fragment =
fragmentManagerfindFragmentById(Riddetails_fragment);
fragmentTransactionremove(fragment);
fragmentTransactioncommit();
replace:
FragmentTransaction fragmentTransaction =
fragmentManagerbeginTransaction();
fragmentTransactionreplace(Ridui_container, new
DetailFragment(selected_index)); //还有个重载方法,可以为新的fragment指定tag
fragmentTransactioncommit();
//这里也解释为什么无视图的不能有id,没有视图哪来的父容器 所以也不能findFragmentByID
可以通过getActivity()来得到FragmentActivity对象,但是建议不要在Fragment中去 *** 作FragmentActivity的东西,建议在FragmentActivity中封装一些方法。
1Fragment是android30引入的新控件,果应用使用在30以下、16及以上的版本,需要引入v4包。
2Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。
3Fr期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。
4FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的 *** 作。在Activity运行期间可以添加Fragment而不是在XML布局文件中进行定义。如果打算在Activity中改变Fragment的生命过程。如果要执行添加、删除、修改的 *** 作,必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些 *** 作。
5两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。
答:因为对应fragment对应的XML 文件没有载入,导致在导入ID 的时候报ID空指针,不过可以在onViewCreated方法中进行ID 的直接调用,因为onCreateView 在onViewCreated之后执行
在构造方法,或者set方法等注入fragment,类似很多自定义控件使用Context一样。
可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。
使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment)。
InputMethodManager有一个方法isActive(View view):如果view是输入法的活动view,则返回true。也就是说,如果是由view触发d出软键盘,则返回true。
if(isActive(edittext))
隐藏键盘
接着让另一个view强制获取焦点,这样isActivite(ediitext)就为false
这个方法比较简单,代码比较短,也很好理解。
附上代码:
InputMethodManager inputMethodManager = (InputMethodManager)getActivity()getSystemService(ContextINPUT_METHOD_SERVICE);<br>private boolean hideKeyboard(){
if(inputMethodManagerisActive(searchEditText)){<br>//因为是在fragment下,所以用了getView()获取view,也可以用findViewById()来获取父控件
getView()requestFocus();//使其它view获取焦点这里因为是在fragment下,所以便用了getView(),可以指定任意其它view
inputMethodManagerhideSoftInputFromWindow(getActivity()getCurrentFocus()getWindowToken(), InputMethodManagerHIDE_NOT_ALWAYS);
return true;
}
return false;
}
ps: 如果是手动d出键盘,getActivity()getCurrentFocus()改成searchEditText并且手动d出的键盘isActivie()失效,可用标记来判断
以上就是关于子fragment如何刷新父fragment的内容全部的内容,包括:子fragment如何刷新父fragment的内容、android从fragment在父activity中怎么能够访问UI elements、如何在Fragment中获取FragmentActivity中的布局等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)