我正在使用Bundle将数据通过Activity传递到Fragment,Bundle从计数器中获取其值,计数器基于Thread更新其值。
我能够在Fragment中获取数据,但是Fragment的UI仅在Fragment Transaction上更新,所以问题是
如何实时更新片段Ui
代码如下:
int i=0;
Sbundle = new Bundle();
thread = new Thread() {
@Override
public void run() {
try {
while (!thread.isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
i++;
Sbundle.putString("speed", String.valueOf(i) );
}
});
}
} catch (InterruptedException e) {
}
}
};
thread.start();
}
片段交易onclick:
public void onClick(View v) {
speedFragment = new SpeedFragment();
speedFragment.setArguments(Sbundle);
RoboActivity activity = MainActivity.this;
if (!isFinishing() && !isDestroyed()) {
FragmentTransaction ft = activity.getFragmentManager()
.beginTransaction();
ft.replace(R.id.fragment_container, speedFragment);
ft.detach(speedFragment).attach(speedFragment).commit();
}
}
在片段一侧:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
mySpeed = bundle.getString("speed");
}
答案 0 :(得分:0)
您分割了哪些UI组件?
例如,如果您拥有TextView,而不仅仅是使用yourTextView.setText(mySpeed)
当然,您需要在片段onCreate()
中绑定文本视图。
还请记住,如果要在进入其他线程后更新UI元素,则应调用getActivity()。runOnUiTnread(new Runnable(){....})
示例:
private void toggleLoadingIndicator(boolean toShow) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
loadingIndicator.setVisibility((toShow ? View.VISIBLE : View.INVISIBLE));
}
});
}
您可以对TextView.setText()
使用相同的技术
答案 1 :(得分:0)
您可以通过attach
和detach
方法直接刷新,如下所示。
FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
ft.detach(f).attach(f).commit();