【发布时间】:2019-12-19 10:12:21
【问题描述】:
我有这个ViewPager,它有5 个Fragment,我设置了setOffscreenPageLimit(4)。现在,当应用启动时,所有五个 Fragments 都已加载。
在Fragment nr 4 中,我想启动Handler,并延迟每秒显示一些数据。我只想在用户选择该片段选项卡时启动它,并在用户转到另一个选项卡时停止“处理程序”。
我找不到直接的好方法来做到这一点。
我使用greenrobot.eventbus 来完成这项工作,因为我知道何时将ViewPager 页面更改为Fragment nr 4。我可以将事件发送到Fragment nr 4。
但我觉得这很丑!
由于 Fragment 仅加载一次,我无法使用 onAttached() 启动 Handler 和 onDetached() 停止 Handler
我为“片段”上的一个“TextViews”创建了一个“getViewTreeObserver”,当“onGlobalLayout()”触发时,“getVisibility()”始终为“View.VISIBLE”,即使我转到其他选项卡'ViewPager'
我还有什么其他选择?
这是我所拥有的,它通过使用 greenrobot.eventbus 和 Fragment 是一个 PreferenceFragmentCompat 和这个自定义 Preference 来工作
import android.content.Context;
import android.os.Handler;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.widget.TextView;
import com.sunlux.smartpower.extended.R;
import com.sunlux.smartpower.extended.entity.EventOnViewPgaerTabChange;
import com.sunlux.smartpower.extended.utils.SettingsManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class ShowStatPreference extends Preference {
private long MEGABYTE = 1024L * 1024L;
private TextView bytesStat;
private Handler mHandler;
private boolean statRunning;
/**
* Timer for updating stat
*/
private final Runnable statRunnable = new Runnable() {
@Override
public void run() {
setStatBytes();
if (statRunning) {
startStatTimer();
}
}
};
public ShowStatPreference(Context context) {
super(context);
}
public ShowStatPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ShowStatPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setWidgetLayoutResource(R.layout.show_stat_preference);
mHandler = new Handler();
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
holder.itemView.setClickable(false); // disable parent click
bytesStat = (TextView) holder.findViewById(R.id.bytes);
super.onBindViewHolder(holder);
}
private void startStatTimer() {
mHandler.postDelayed(statRunnable, 1000);
}
private void setStatBytes() {
long bytes = Long.parseLong(SettingsManager.getByteSent());
long mb = bytes / MEGABYTE;
bytesStat.setText(getContext().getString(R.string.total_bytes, Long.toString(bytes), Long.toString(mb)));
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void workStart(EventOnViewPgaerTabChange event) {
if (event.pos == 4) {
if(statRunning){
// prevent duplicate start
return;
}
statRunning = true;
startStatTimer();
} else {
statRunning = false;
}
}
@Override
public void onAttached() {
EventBus.getDefault().register(this);
super.onAttached();
}
@Override
public void onDetached() {
super.onDetached();
EventBus.getDefault().unregister(this);
}
}
对此有很多问题,但由于我不想访问 PreferenceFragmentCompat 而是访问其中的 Preference,因此我尝试像这样传播来自 PreferenceFragmentCompat 的方法调用
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
// call Preference class ShowStatPreference and start the Handler
}
但是找不到访问PreferenceFragmentCompat的内部类的方法
【问题讨论】:
标签: android android-viewpager visibility