Android 获取当前片段变量值
我正在使用FragmentViewPagerAdapter创建日历活动。每个片段代表一天,我的主要活动上有一个开关,允许用户过滤每个片段的结果。 我使用ViewModel来请求数据,所以当检查开关时,我需要向我的服务器发出新的请求,以获取每个片段的新数据,我的问题是,当我发出请求时,发送的日期是下一个片段的日期,而不是当前片段的日期 我已经尝试将屏幕页面数限制为0,但没有任何更改Android 获取当前片段变量值,android,android-fragments,fragmentstatepageradapter,Android,Android Fragments,Fragmentstatepageradapter,我正在使用FragmentViewPagerAdapter创建日历活动。每个片段代表一天,我的主要活动上有一个开关,允许用户过滤每个片段的结果。 我使用ViewModel来请求数据,所以当检查开关时,我需要向我的服务器发出新的请求,以获取每个片段的新数据,我的问题是,当我发出请求时,发送的日期是下一个片段的日期,而不是当前片段的日期 我已经尝试将屏幕页面数限制为0,但没有任何更改 public class PoiPlanningFragment extends Fragment implemen
public class PoiPlanningFragment extends Fragment implements InitApplicationListener{
MutableLiveData<Boolean> filtered = new MutableLiveData<>();
private Context mContext;
DateTime startTime;
DateTime endTime;
switcher = getActivity().findViewById(R.id.app_switcher);
public PoiPlanningFragment() {
// Required empty public constructor
}
public static Fragment getInstance(int position, String date, String resourceId, String resourceType,boolean filter) {
Bundle bundle = new Bundle();
bundle.putInt("pos", position );
bundle.putString("date", date);
bundle.putString(ARG_RESOURCE_ID, resourceId);
bundle.putString(ARG_RESOURCE_TYPE, resourceType);
PoiPlanningFragment tabFragment = new PoiPlanningFragment();
tabFragment.setArguments(bundle);
return tabFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DateTimeFormatter horaire = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
startTime = horaire.parseDateTime(date.concat(" " + STARTHOUR));
endTime = horaire.parseDateTime(date.concat(" " + ENDHOUR));
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_poi_planning, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
//Switch my meetings
switcher.setOnCheckedChangeListener(new SwitchClickedListener(this.filtered));
//Observes whether the user has a filter on own meetings or not
filtered.observe(this, filtered -> {
//here startTime always shows next tab startTime and endTime
BookingRepository.getUserPlanning(planning,resourceId,Utility.toTimeStamp(startTime),Utility.toTimeStamp(endTime), filtered);
loader.setVisibility(View.VISIBLE);
});
}
}
private class SwitchClickedListener implements CompoundButton.OnCheckedChangeListener{
MutableLiveData<Boolean> listener;
SwitchClickedListener(MutableLiveData<Boolean> listener){
this.listener = listener;
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//Set filter to true
this.listener.setValue(b);
}
}
public class PoiPlanningViewPagerAdapter extends FragmentStatePagerAdapter {
private final static String TAG = PoiPlanningViewPagerAdapter.class.getName();
private List<Date> dateList;
private Context context;
private String poiId;
private String resouceType;
public PoiPlanningViewPagerAdapter(FragmentManager fm, List<Date> dates, String poidId,String resourceType, Context context) {
super(fm);
this.dateList = dates;
this.context = context;
this.poiId = poidId;
this.resouceType = resourceType;
}
@Override
public Fragment getItem(int position) {
Date datetime = dateList.get(position);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(datetime);
PoiPlanningFragment planningFragment = (PoiPlanningFragment) PoiPlanningFragment.getInstance(position, date, poiId,resouceType,false);
return planningFragment;
}
@Override
public int getCount() {
return dateList.size();
}
@Override
public CharSequence getPageTitle(int position) {
Date datetime = dateList.get(position);
DateFormat df = new SimpleDateFormat(context.getString(R.string.date_format));
String date = df.format(datetime);
return date;
}
}
公共类PoiPlanningFragment扩展了片段实现InitApplicationListener{
MutableLiveData filtered=新的MutableLiveData();
私有上下文;
日期时间开始时间;
日期时间结束时间;
切换器=getActivity().findViewById(R.id.app\u切换器);
公共规划片段(){
//必需的空公共构造函数
}
公共静态片段getInstance(int位置、字符串日期、字符串resourceId、字符串resourceType、布尔过滤器){
Bundle=新Bundle();
bundle.putInt(“位置”,位置);
bundle.putString(“日期”,date);
bundle.putString(ARG\u RESOURCE\u ID,resourceId);
bundle.putString(参数资源类型,资源类型);
PoiPlanningFragment tabFragment=新的PoiPlanningFragment();
tabFragment.setArguments(bundle);
返回片段;
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
DateTimeFormatter horaire=DateTimeFormat.forPattern(“yyyy-MM-dd-HH:MM”);
startTime=horaire.parseDateTime(date.concat(“+STARTHOUR”);
endTime=horaire.parseDateTime(date.concat(“+ENDHOUR));
//为该碎片膨胀布局
返回充气机。充气(R.layout.fragment\u poi\u planning,容器,错误);
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
//切换我的会议
setOnCheckedChangeListener(新的SwitchClickedListener(this.filtered));
//观察用户在自己的会议上是否有筛选器
过滤。观察(此,过滤->{
//此处startTime始终显示下一个选项卡startTime和endTime
BookingRepository.getUserPlanning(规划、资源ID、实用程序.toTimeStamp(startTime)、实用程序.toTimeStamp(endTime)、过滤);
loader.setVisibility(View.VISIBLE);
});
}
}
私有类SwitchClickedListener实现CompoundButton.OnCheckedChangeListener{
可变livedata监听器;
SwitchClickedListener(可变LiveData listener){
this.listener=listener;
}
@凌驾
检查更改后的公共无效(复合按钮复合按钮,布尔b){
//将过滤器设置为true
this.listener.setValue(b);
}
}
公共类PoiPlanningViewPagerAdapter扩展了FragmentStatePagerAdapter{
private final static String TAG=PoiPlanningViewPagerAdapter.class.getName();
私人名单日期表;
私人语境;
私有字符串POID;
私有字符串资源类型;
公共PoiPlanningViewPagerAdapter(FragmentManager格式、列表日期、字符串poidId、字符串资源类型、上下文){
超级(fm);
this.dateList=日期;
this.context=上下文;
this.poid=poidId;
this.resourceType=resourceType;
}
@凌驾
公共片段getItem(int位置){
Date datetime=dateList.get(位置);
DateFormat df=新的简化格式(“yyyy-MM-dd”);
字符串日期=df.format(日期时间);
PoiPlanningFragment planningFragment=(PoiPlanningFragment)PoiPlanningFragment.getInstance(位置、日期、POID、资源类型,false);
返回计划碎片;
}
@凌驾
public int getCount(){
return dateList.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
Date datetime=dateList.get(位置);
DateFormat df=新的SimpleDataFormat(context.getString(R.string.date_格式));
字符串日期=df.format(日期时间);
返回日期;
}
}
在前面的代码中,如果我检查开关,并且我在周一02 11,它将加载周二的数据。您可以使用supportFragmentManager获取当前片段 下面的代码将帮助您
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
val frag = getSupportFragmentManager().findFragmentById(R.id.container);
if (frag is HomeFragment) {
Fragment currentFragment = (HomeFragment) frag;
//do your code
return
}
}
我希望这将对您有所帮助。您可以使用supportFragmentManager获取当前片段
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
val frag = getSupportFragmentManager().findFragmentById(R.id.container);
if (frag is HomeFragment) {
Fragment currentFragment = (HomeFragment) frag;
//do your code
return
}
}
下面的代码将帮助您
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
val frag = getSupportFragmentManager().findFragmentById(R.id.container);
if (frag is HomeFragment) {
Fragment currentFragment = (HomeFragment) frag;
//do your code
return
}
}
我希望这能对您有所帮助。您能在开始片段的地方发布代码部分吗?我添加了适配器代码,似乎是
日期列表
数组的位置有问题。您是否尝试过日期列表。获取(位置1)?是,当活动第一次启动时,问题就出现了。正确的开始位置是0,因此如果我输入-1,我将得到一个错误。什么是STARTHOUR
和ENDHOUR
值?您是否也可以在开始片段的地方发布代码部分?我添加了适配器代码,似乎在dateList
数组。您是否尝试过日期列表。获取(位置-1)?是的,问题出现在活动开始时第一次正确从位置0开始,因此如果我输入-1,我将得到一个错误。STARTHOUR
和ENDHOUR
值是什么?谢谢您的回答,但它似乎没有解决问题,因为我从片段中得到了0个计数。谢谢你的回答,但它似乎没有解决问题,因为我从片段中得到了0个计数。
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
val frag = getSupportFragmentManager().findFragmentById(R.id.container);
if (frag is HomeFragment) {
Fragment currentFragment = (HomeFragment) frag;
//do your code
return
}
}