我有一个FragmentActivity,一些片段和一个在后台运行的服务.如果特定片段可见,可以从服务中检查?
我知道StackOverflow中有很多类似的问题,但我的问题却略有不同.
我有嵌套的Fragments层次结构,如下面的结构:
Activity
|
|
AFragment
|
(ViewPager)
| |
| |
BFragment BFragment .....
|
(ViewPager)
| |
| |
CFragment CFragment ...
|
(ViewPager)
| |
| |
DFragment DFragment ...
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否DFragment向用户显示?
我尝试了很多来自StackOverflow的解决方案,但无法取得成功.
我尝试的是:
我尝试setUserVisibleHint()但它返回上面的层次结构中的true多个DFragment,这是一个原因ViewPager
我也试过这些链接:link1,link2,link3等......但没有得到实际的解决方案.
等待帮助.谢谢.
UPDATE
适配器类
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager); …Run Code Online (Sandbox Code Playgroud) java android android-fragments android-view android-viewpager
我的代码的某些部分如何知道片段实例在屏幕上可见?
以下代码片段将解释我的问题.
public class MyApp extends Application {
public static final String TAG = MyApp.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
...
@Override
public void onActivityResumed(Activity activity) {
Log.d(TAG, activity.getClass().getSimpleName() + " is on screen");
}
@Override
public void onActivityStopped(Activity activity) {
Log.d(TAG, activity.getClass().getSimpleName() + " is NOT on screen");
}
...
});
}
Run Code Online (Sandbox Code Playgroud)
在这里,我可以跟踪我的应用程序中的任何活动何时出现在屏幕上.有没有办法在Fragments上扩展这种方法?
就像是
Activity.getFragmentManager().registerFragmentLifecycleCallbacks();
UPD.我对活动实现一无所知,他们是否使用片段以及他们如何使用片段(通过xml,ViewPager等注入).我班上唯一拥有的是应用程序上下文.假设Activity和Fragment实现是黑盒子,我无法进行任何更改.
我问这个因为我有点好奇.
1)如果片段已经在xml中创建,大多数谷歌演示会通过其ID找到片段.
因此,如果我们采用这种方法,我们显示片段的方式是隐藏它并显示它,因为已经创建了片段.
2)google也提供了一些示例,您可以使用构造函数创建片段并对其进行充气.如果在该片段中调用getActivity(),则getActivity()返回null的方式很奇怪.
因此,如果我采取第一种方法,我必须隐藏并显示碎片.那么为什么google不提供像onHide或onShow这样的片段的钩子,这样我们就可以正确地处理事情了,如果用我们实现的函数和显式调用来清理自己.
我在 ViewPager 中使用了 4 个片段,因为 ViewPager 提前加载了上一个和下一个片段,并且在片段之间导航时没有调用生命周期方法。那么有什么方法可以检测 Fragment 何时实际可见。提前致谢。
抱歉我的愚蠢标题,我将在下面清楚地描述:
情况
我有ViewPager4 OnBoardingFragment秒内.每个Fragment都具有完全相同的布局,inflated来自相同的xml文件.这个布局包含Button我调用的一个,我为它btnNext设置了OnClickListener它.
getItem我的PagerAdapter的功能
@Override
public Fragment getItem(int position) {
String title, description, button;
int resource;
boolean end = false;
switch (position) {
case 0:
title = context.getString(R.string.on_boarding_title_1);
description = context.getString(R.string.on_boarding_description_1);
resource = R.drawable.on_boarding_bg_0;
button = context.getString(R.string.on_boarding_button_1);
break;
case 1:
title = context.getString(R.string.on_boarding_title_2);
description = context.getString(R.string.on_boarding_description_2);
resource = R.drawable.on_boarding_bg_1;
button = context.getString(R.string.on_boarding_button_2);
break;
case 2:
title = context.getString(R.string.on_boarding_title_3);
description = context.getString(R.string.on_boarding_description_3);
resource = R.drawable.on_boarding_bg_2;
button …Run Code Online (Sandbox Code Playgroud) 我的用例:
我有一个活动,其中有一个ViewPager作为唯一的视图元素,Fragment为其三个页面设置了三个s(使用a FragmentPagerAdapter).其中一个片段是a ListFragment,而另外两个常规Fragments包含一些信息图表.
在列表中ListFragment允许"检查"元素,并检查元素带来了上下文操作栏,呈现的操作的列表可能选定/检查的项目.
我的问题:
当我选择几个列表项时,CAB会显示出来.但是当我切换页面时,CAB保持可见,呈现动作.更糟糕的是,ViewPager似乎有时会破坏列表片段的视图 - 因此选择操作会引发"java.lang.IllegalStateException: Content view not yet created"异常.
我的问题:
ListFragment页面时,如何让CAB消失?ListFragment背面和某些项目仍然被检查时,如何让CAB重新出现.android android-viewpager android-listfragment contextual-action-bar
我使用ViewPager和PagerSlidingTabStrip,我有3个片段,每个片段都有自己的自定义监听器.在每个片段中,我都覆盖了Destroy,Pause方法,但不幸的是,当我从一个片段移动到另一个片段时,我必须删除一个片段的监听器,但是由于片段保留在内存中,因此不会调用上述方法.这些方法仅在我移动到另一个Activity时调用.因此,任何身体都可以告诉我如何知道片段是否会变得不可见,以便我可以删除监听器,否则这些监听器将会干扰我所有片段的数据.
我正在尝试使用VectorDrawable上的一些动画实现简单的ViewPager.
遵循这个非常好的示例解决方案,用于使用点切换进行漂亮的标签滚动.
唯一的区别是我正在使用矢量动画.作为一项活动,它就像一个魅力,添加了ViewPager,动画不会始终如一地启动.
compileSdkVersion 25
buildToolsVersion "26.0.2"
targetSdkVersion 25
Run Code Online (Sandbox Code Playgroud)
我正在我的设备上调试(SG7),我在animation.start()上设置了断点
所有这一切都在一个大的VectorDrawable上工作,其中3组是动画的.
2个字幕在开始时滑动,然后无限滚动旋转,旋转始终工作.
活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mHideHandler.post(mHidePart2Runnable);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(mViewPager, true);
};
Run Code Online (Sandbox Code Playgroud)
分段:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called …Run Code Online (Sandbox Code Playgroud) user-interface android android-viewpager android-fragmentactivity android-vectordrawable
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInVisible();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这部分代码没有执行。
我需要检测用户何时从我的一个片段中滑入和滑出,我尝试onPause但是当滑动到相邻的屏幕时它似乎没有暂停(当它移动两个sereens时它被破坏).如果可能的话,我想从片段本身做到这一点,因为我正在动态地更改片段,而某些代码只有在存在某个片段时才有用.
是否有可能做到这一点?如何检测滑动"out"(如果可能,从片段本身)?
编辑:
我尝试在Fragment上使用setUserVisibleHint,这似乎是最好的方法,但它永远不会被调用.我正在使用API级别19,我不确定缺少什么:
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class Contacts extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_screen_contacts, container, false);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.d("MyFragment", "This never shows up.");
Toast.makeText(getActivity(), "Neither does this", Toast.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个显示不同片段的应用程序ViewPager.我将这些片段添加到ViewPager这样的:
public void intialiseViewPager()
{
List<Fragment> fragments = new Vector<Fragment>();
numberOfTabs = application.currentReport.getODTabsList().size();
for (int i = 0; i < numberOfTabs; i++)
{
ODTab tempTab = application.currentReport.getODTabsList().get(i);
if (tempTab.getTabType().equals(ODGrid.XML_GRID_ELEMENT))
{
GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());
fragments.add(gridFragment);
}
else if (tempTab.getTabType().equals(ODChart.XML_CHART_ELEMENT))
{
NewChartFragment chartFragment = NewChartFragment.newInstance(tempTab.getTabId());
fragments.add(chartFragment);
}
}
Log.d(TAG, "Current report fragments set to adapter: "+fragments.toString());
mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(0);
mViewPager.setOnPageChangeListener(this);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我tempTab.getTabId()在此行中传递了一个String()片段:
GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());
Run Code Online (Sandbox Code Playgroud)
在片段本身我这样做来初始化它:
public …Run Code Online (Sandbox Code Playgroud) 我正在寻找停止在Viewpager中预加载页面的示例源代码。通常,android viewpager会自动加载下一页和上一页。我的目标是使用viewpager,并且我希望在用户可见时在视图(页面中存在)上显示动画。基本上是继续上一篇 文章。
如果您能给我任何可行的例子(完整的代码),那就太好了。我发现了很多,但没有找到任何可行的实现。谢谢你的帮助。关于比斯瓦吉特
android android-fragments android-viewpager android-pageradapter