Fragment应该在哪个方法中获取控件并初始化

Fragment应该在哪个方法中获取控件并初始化,第1张

Fragment当然是在Activity onCreate方法中创建

启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

Fragment中如何获取listview我的FileFragment继承了Fragment,现在我想要在FileFragment中获取获取filexml

Fragment中如何获取listview

我的FileFragment继承了Fragment,现在我想要在FileFragment中获取获取filexml中的一个listview,我用了下面两种方式:

//fileListView=(ListView)getActivity()findViewById(Ridfile_list);得到空指针

fileListView=(ListView)inflaterinflate(Ridfile_list, null);找不到资源

请指教在Fragment中如何获取listview。

[解决办法]

View rootView = inflaterinflate(Rlayoutfile, null); //先解析filexml布局,得到一个view

ListView listView = (ListView) rootViewfindViewById(Ridfile_list);

fragment中怎么读取sharedpreferences数据

获取SharedPreferences的两种方式:

1 调用Context对象的getSharedPreferences()方法

2 调用Activity对象的getPreferences()方法

两种方式的区别:

调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享

调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用

ViewPager中如何获取Fragment

在做项目时,遇到Fragment与Fragment、Fragment与Activity需要相互通信、传递数据以及进行互

*** 作的问题,查阅了官方文档,也实现了官方的例子,但实际项目是ViewPager+Fragment,按官方的例

子,总是获取不到Fragment的引用,如:

HeadLinesFragment headLinesFrag = (HeadLinesFragment)

getSupportFragmentManager()findFragmentById(Ridheadline_fragment);

这是因为在ViewPager里Fragment是new出来动态加到ViewPager里的,上需的Id只是Fragment的布

局文件的根Id,不是Fragment 的Id,故获取的Fragment为空

查询相关资料后,终于找到如下解决方案:

一般来讲,我们再使用viewpager的时候,是在代码中动态的添加fragment。此时,我们不能去指定

fragment的id,也不能指定他的tag,如果你一定要去指定tag,运行时会提示,tag已经被指定。那么,在动

态的添加了fragment之后,我们如何能获取到该fragment并修改其中的内容呢。两种方法:

第一种方法实际上是一种hack方法,并没有官方文档说明支持。代码如下:

SomeFragment someFragment = getSupportFragmentManager()FindFragmentByTag(“android:switcher:” + Ridviewpager + “:0″);

if (someFragment != null) //可能没有实例化

{

if (someFragmentgetView() != null)

{

someFragmentupdateView();//自定义方法更新

}

}

这里要记住的就是”android:switcher:” + Ridviewpager + “:0″ 这个字符窜表示的就是该

fragment的tag,其中0 是fragment 在viewpager中的位置。

第二种方法更正规,因为第一种方法对基于FragmentPagerAdapter的实现是有效的,但对于

FragmentStatePagerAdapter就无效了。因为FragmentStatePagerAdapter不会对传给

FragmentManager的Fragment设置tag

ViewPager pager = (ViewPager)findViewById(Ridviewpager);

FragmentStatePagerAdapter f = pagergetAdapter();

SomeFragment someFragment = (SomeFragment)finstantiateItem(pager,position);

instantiateItem(pager,position)方法会返回在position位置的fragment的引用。如果该

fragment 已经实例化了,再次调用instantiateItem(pager,position)的时候,该方法并不会调用

getItem()来再次实例化fragment,而是直接返回引用。

方法三更简单:

Activity里的语句:

mPagerAdapter = new DownloadSlidePagerAdapter(getSupportFragmentManager());

LocalVideoListFragment fragment = ((LocalVideoListFragment)mPagerAdaptergetItem(mCurrItem));

fragmentrefresh();

DownloadSlidePagerAdapter:

public class DownloadSlidePagerAdapter extends FragmentPagerAdapter {

Fragment[] fragments = {new DownloadListFragment(),new LocalVideoListFragment()};

public DownloadSlidePagerAdapter(FragmentManager fm) {

super(fm);

}

@Override

public Fragment getItem(int position) {

return fragments[position];

}

@Override

public int getCount() {

return fragmentslength;

}

}

直接获取new的实例对象应用

public void intialiseViewPager()

{

List<Fragment> fragments = new Vector<Fragment>();

numberOfTabs = applicationcurrentReportgetODTabsList()size();

for (int i = 0; i < numberOfTabs; i++)

{

ODTab tempTab = applicationcurrentReportgetODTabsList()get(i);

if (tempTabgetTabType()equals(ODGridXML_GRID_ELEMENT))

{

GridFragment gridFragment = GridFragmentnewInstance(tempTabgetTabId());

fragmentsadd(gridFragment);

}

else if (tempTabgetTabType()equals(ODChartXML_CHART_ELEMENT))

{

NewChartFragment chartFragment = NewChartFragmentnewInstance(tempTabgetTabId());

fragmentsadd(chartFragment);

}

}

Logd(TAG, "Current report fragments set to adapter: "+fragmentstoString());

mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);

mViewPager = (ViewPager)findViewById(Ridpager);

mViewPagersetAdapter(mPagerAdapter);

mViewPagersetOffscreenPageLimit(0);

mViewPagersetOnPageChangeListener(this);

}

你可以看到我将字符串传递到片段 ( tempTabgetTabId() ),在这一行:

GridFragment gridFragment = GridFragmentnewInstance(tempTabgetTabId());

当片段中它自已我这样做对其进行初始化:

public static final GridFragment newInstance(String tabId)

{

GridFragment f = new GridFragment();

Bundle bdl = new Bundle(2);

bdlputString(TAB_ID, tabId);

fsetArguments(bdl);

return f;

}

@Override

public void onCreate(Bundle savedInstanceState)

{

String tabId = getArguments()getString(TAB_ID);

if (applicationcurrentReport != null)

{

thisodTab = applicationcurrentReportgetODTabByTabId(tabId);

}

else

{

startActivity(new Intent(getActivity(), LoginScrActivityclass));

}

superonCreate(savedInstanceState);

}

所有这一切被执行,不会覆盖默认空的构造函数的片段,按照我的理解这非常不建议。

现在我需要获取实例的 odTab 对象放进这行中的当前可见片段:

thisodTab = applicationcurrentReportgetODTabByTabId(tabId);

可能有些人请给我解释如何做到这吗?所以我可以把它的 odTab 对象,如何获取当前可见片段实例

更新:这里提出的意见与我加入了 odTab 到调用的应用程序类的对象实例 currentVisibleTab 和我设置 odTab 这样的实例:

@Override

public void setUserVisibleHint(boolean isVisibleToUser)

{

Logd(TAG, "setUserVisibleHint invoked!");

supersetUserVisibleHint(isVisibleToUser);

if (isVisibleToUser)

{

if (odTab != null && getActivity() != null)

{

Logd(TAG, "Currently visable tab: "+odTabgetTabTitle());

applicationcurrentVisibleTab = odTab;

}

}

}

更新 2:我有一种 ViewPagerAdapter :

public class ViewPagerAdapter extends FragmentPagerAdapter

{

private List<Fragment> fragments;

/

@param fm

@param fragments

/

public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {

super(fm);

thisfragments = fragments;

}

/ (non-Javadoc)

@see androidsupportv4appFragmentPagerAdapter#getItem(int)

/

@Override

public Fragment getItem(int position) {

return thisfragmentsget(position);

}

/ (non-Javadoc)

@see androidsupportv4viewPagerAdapter#getCount()

/

@Override

public int getCount() {

return thisfragmentssize();

}

@Override

public int getItemPosition(Object object) {

return POSITION_NONE;

}

public void removeAllFragments()

{

thisfragmentsclear();

}

public void addFragmentsListToAdapter(List<Fragment> fragments)

{

thisfragmentsaddAll(fragments);

}

public List<Fragment> getFragments()

{

return fragments;

}

}

在它正如你看到的我有 List 的片段所示的 ViewPager ,此列表初始化像这样:

List<Fragment> fragments = new Vector<Fragment>();

我不明白的是如何获取对当前段落触发从该列表中的接口方法的引用。不相关的问题,但也许你知道答案,有什么区别之间List 和 Vector

我还查阅了此选项。

先谢谢了。

解决方法 1:

我找到的方法 visbile 片段当前正在使用 setUserVisibleHint 和回视图寻呼机的接口。此方法是在类中片段。重写它和使用回叫您查看传呼机的接口。如果该片段是可见-即它返回 true-只使用对您片段 (无论是从列表中备份您的适配器或一个您存储为一个实例变量) 的引用以获取您需要的任何从片段本身。我已经添加下面的代码。

声明有关的无论你想做一个接口。我的情况我用这来禁用 ViewPager 默认 x 方向侦听器时一个谷歌地图实例是可见的因此滚动地图没有触发片段的变化。

public interface OnMapFragmetnVisibleListener{

public void mapVisible(boolean visible);

}

在片段:

@Override

public void onAttach(Activity activity){

superonAttach(activity);

try{

mapFragmentVisibilityListener = (OnMapFragmentVisibleListener) activity;

isAttached = true; //flag for whether this framgnet is attache to pager

} catch (ClassCastException e){

throw new ClassCastException(activitytoString() + " must implement interface onAttach");

}

@Override

public void setUserVisibleHint(boolean isVisibleToUser){

if(isVisibleToUser && isAttached){ //if listner is called before fragment is attached will throw NPE

mapFragmentVisibilityListenermapVisible(true);

}

}

直到我试过这个是不明显的一件事是 isAttached 变量的加法。我也重写片段 onAttach 方法,并将其设置为 true,一旦它被称为。否则会发生什么是您片段将对用户是可见的和尝试调用的接口向您 ViewPager 接口初始化之前。

在我 ViewPager 我只是实现了 OnMapFragmentVisibleListener,然后添加所需的方法

@Override

public void mapVisible(boolean visible) {

if(visible)

viewPagerallowSwipe(false); //turn off viewPager intercept touch if map visible

}

在我的案子我用它来关闭 ViewPager 刷功能但是,我可以轻松地叫回来的公共方法中我 mapFragment。我碰巧有 3 片段我 ViewPager 我保持对的引用

更新

要查找当前的片段首先显示你需要找出哪个片段正在显示你可以通过多种方式。最简单的方法就是通过一些描述符返回到您ViewPager / FragmentActivity 与您之前创建的接口。

public interface OnFragmentVisibleListener{

public void fragmentVisible(boolean true, String tag);

}

那您设置的问题是您正在使用 Vector ,是真的同步 List 来存储您片段 rerefences。其结果是,没有通过,你可以找到你片段以后的密钥值。片段有确定的一个标签,创建在片段获利的能力,它们被添加到该片段活动期间。然而,在 ViewPager设置,您没有添加片段分别,所以无法添加标签在获利。

我的解决方案一直是回我 BasePagerAdapter 与 HashMap 在其中存储由一个唯一的密钥标识每个片段。

LinkedHashMap<String, Fragment> tabs = new LinkedHashMap<String, Fragment>();

tabsput("Frag1", fragment1);

tabsput("Frag2", fragment2);

tabsput("Frag3", fragment3);

然后用此适配器

private class BasePagerAdapter extends FragmentPagerAdapter{

private LinkedHashMap<String, Fragment> tabs;

public BasePagerAdapter(LinkedHashMap<String, Fragment> tabMap, FragmentManager fm)

{

super(fm);

thistabs = tabMap;

}

// other basic methods

因为您的引用存储到一个密钥值、 容易找到因为你只是可以通过从键值哈希映射和返回键搜索你要找的 framgment。

如果您不能更改设置要逃离 Vector 你需要到任一 (1) 跟踪的哪个片段你添加的顺序 (假设片段不添加和删除动态) 这样,你可以通过对每个片段 (2) 保持单独引用或索引

private Fragment x;

//in onCreate

x = new Fragment();

//in interface

if(tagequals("x"){

xdoSomething();

}

以上就是关于Fragment应该在哪个方法中获取控件并初始化全部的内容,包括:Fragment应该在哪个方法中获取控件并初始化、如何在fragment中获取view、fragment中怎么读取SharedPreferences数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9378208.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存