【问题标题】:Android: How to change view in Fragment that receive data from MainActivityAndroid:如何更改从 MainActivity 接收数据的 Fragment 中的视图
【发布时间】:2016-05-21 17:28:52
【问题描述】:

我正在开发从蓝牙设备接收数据以在 viewpager 中分段的应用程序。 我的应用程序正在处理它

  1. MainActivity 从蓝牙设备接收数据

  2. MainActivity 的静态 String 值更改为来自蓝牙设备的数据

  3. MainActivity 中viewpager 中fragment 的进度条将数据刷新为MainActivity 的数据(已更改整数)

  4. 当 MainActivity 的数据发生变化时,fragment 的进度条会刷新数据并查看

    public class BalanceFragment extends Fragment{
    
    public static String data = "0";
    private String old = data;
    
    private ProgressBar progressBar;
    private TextView textView;
    private Handler handler;
    private MyThread myThread;
    
    public BalanceFragment() {
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        return inflater.inflate(R.layout.fragment_balance, container, false);
    }
    
    @Override
    public void onStop() {
        try{
            myThread.stop();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
        textView = (TextView) view.findViewById(R.id.balanceProgressText);
        myThread = new MyThread();
        myThread.run();
    }
    
    @Override
    public void onResume() {
        myThread.run();
    }
    
    class MyThread extends Thread{
        @Override
        public void run() {
            while(true) {
                try {
                    this.sleep(5000);
                    MainActivity.println("test", "test");
                } catch (Exception e){
                    e.printStackTrace();
                }
                if (old != data){
                    old = data;
                    progressBar.setProgress(Integer.valueOf(data));
                    textView.setText(data);
                    progressBar.invalidate();
                    textView.invalidate();
                }
             }
          }
       }
    }
    

但是......当我启动这个应用程序时,视图被冻结...... 我不知道为什么我的应用被冻结了

【问题讨论】:

  • 您不应该从单独的线程更新视图,这可能是错误行为的原因。

标签: java android android-fragments bluetooth android-viewpager


【解决方案1】:

你可以创建一个与fragment通信的接口,例如:

public class TestActivity extends Activity {

    interface DataCallback {

        void onData(String data);

    }

    DataCallback callback;

    @Override
    protected void onResume() {
        super.onResume(savedInstanceState);

        SampleFragment fragment = SampleFragment.newInstance();
        callback = fragment.getCallback();
        getFragmentManager().beginTransaction().replace(R.id.container, fragment, "tag").commit()

    }

    public static class SampleFragment extends Fragment implements DataCallback {

        public static SampleFragment newInstance() {

            Bundle args = new Bundle();

            SampleFragment fragment = new SampleFragment();
            fragment.setArguments(args);
            return fragment;
        }

        public DataCallback getCallback() {
            return this;
        }

        @Override
        public void onData(String data) {
            //Update UI with data
        }
    }

}

每次您的活动收到新数据时,您应该调用:

callback.onData(variableValue)

并传递新数据。

【讨论】:

  • 我是否将它应用于我的情况,即一个应用程序有 5 个 Fragment 类分隔 MainActivity、1 个 customViewPagerAdapter、1 个 MainActivity?..... 我必须将 Fragment 实现为内部类吗??
  • 如果您在更复杂的情况下使用汽车,请使用link 在您的活动和其他片段内的所有消费者上创建生产者接口。这里是例子link
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2022-10-25
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多