首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >碎片之间的动态通信失败

碎片之间的动态通信失败
EN

Stack Overflow用户
提问于 2015-01-26 12:19:04
回答 1查看 35关注 0票数 0

我试图在两个fragments之间动态地进行通信。Frag1导入sensorlistener并将值传递给mainActivity

mainActivity实现了onSendListener.onSendValues接口。在onSendValuesmainActivity中的实现中,当用户单击Frag1中定义的按钮时,通过访问Frag2的公共方法,将从Frag1接收到的加速度计(x、y、z)的值通过mainActivity传递给Frag2

代码语言:javascript
运行
复制
void returnedX(float x) {...}
void returnedY(float y) {...}
void returnedZ(float z) {...}

当用户单击Frag1中的按钮时,Frag2中的textViews不管他们的公共方法都不会显示任何内容。

代码语言:javascript
运行
复制
void returnedX(float x) {...}
void returnedY(float y) {...}
void returnedZ(float z) {...}

调用时,我确信它们是被调用的,因为如下所示,Log语句在Frag2中的公共方法中是显示的,但是acce er示波器的值不显示。

请参阅下面的代码,并让我知道为什么Frag2中的公共方法不显示来自Frag1的传递日期

MainActivity

代码语言:javascript
运行
复制
public class MainActivity extends Activity implements onSendListener {

Frag2 frag2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    frag2 = (Frag2)getFragmentManager().findFragmentById (R.id.frag_2);
}

/**
 * to send values from frag1 to frag2 through mainActivity. use bundle.
 */
@Override
public void onSendValues(float x, float y, float z) {
    // TODO Auto-generated method stub      
    frag2.returnedX(x);
    frag2.returnedY(y);
    frag2.returnedZ(z);
}

}

Frag1

代码语言:javascript
运行
复制
public class Frag1 extends Fragment implements SensorEventListener {

private SensorManager sensorManager;
TextView tvAccX;
TextView tvAccY;
TextView tvAccZ;

private float x = 0.0f;
private float y = 0.0f;
private float z = 0.0f;

private void setAccX(float x) {
    this.x = x;
}
private float getAccX() {
    return this.x;
}

private void setAccY(float y) {
    this.y = y;
}
private float getAccY() {
    return this.y;
}

private void setAccZ(float z) {
    this.z = z;
}
private float getAccZ() {
    return this.z;
}

Button btnSend;
onSendListener sendValues;

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);

    sendValues = (onSendListener) activity;
    sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater.inflate(R.layout.frag_1, container, false);

    tvAccX = (TextView) view.findViewById(R.id.tv_accX_value);
    tvAccY = (TextView) view.findViewById(R.id.tv_accY_value);
    tvAccZ = (TextView) view.findViewById(R.id.tv_accZ_value);
    btnSend = (Button) view.findViewById(R.id.btn_send);

    return view;
}

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        showAccReadings(event);
        break;

    default:
        break;
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

private void showAccReadings(SensorEvent event) {
    // TODO Auto-generated method stub
    float[] values = event.values;

    float x = values[0];
    float y = values[1];
    float z = values[2];

    setAccX(x);
    setAccY(y);
    setAccZ(z);

    tvAccX.setText(String.valueOf(x));
    tvAccY.setText(String.valueOf(y));
    tvAccZ.setText(String.valueOf(z));
}

@Override
public void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    Sensor accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, accSensor, sensorManager.SENSOR_DELAY_FASTEST);

    btnSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            sendValues.onSendValues(getAccX(), getAccY(), getAccZ());
        }
    });
}

@Override
public void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    sensorManager.unregisterListener(this);
}

}

Frag2

代码语言:javascript
运行
复制
public class Frag2 extends Fragment {

TextView tvX;
TextView tvY;
TextView tvZ;

float returnX ;
float returnY ;
float returnZ ;

void returnedX(float x) {
    if (getView() != null) {
        Log.d("Frag2", "X: View is not null");
        this.returnX = x;
    }
}
void returnedY(float y) {
    if (getView() != null) {
        Log.d("Frag2", "Y: View is not null");
        this.returnY = y;
    }
}
void returnedZ(float z) {
    if (getView() != null) {
        Log.d("Frag2", "Z: View is not null");
        this.returnZ = z;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    View view = inflater.inflate(R.layout.frag_2, container, false);

    tvX = (TextView) view.findViewById(R.id.tv_accX2_label);
    tvY = (TextView) view.findViewById(R.id.tv_accY2_label);
    tvZ = (TextView) view.findViewById(R.id.tv_accZ2_label);

    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);

    Log.d("Frag2", "View is not null");
    tvX.setText("" + this.returnX);
    tvY.setText("" + this.returnY);
    tvZ.setText("" + this.returnZ);
}

}

日志输出

代码语言:javascript
运行
复制
01-26 13:03:36.876: D/Frag2(16146): X: View is not null
01-26 13:03:36.876: D/Frag2(16146): Y: View is not null
01-26 13:03:36.876: D/Frag2(16146): Z: View is not null
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 12:29:15

您需要将实际值设置为TextViews

代码语言:javascript
运行
复制
void returnedX(float x) {
    if (tvX != null) {
        tvX.setText("" + x);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28149994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档