相关疑难解决方法(0)

进一步了解setRetainInstance(true)

什么究竟,当你调用发生setRetainInstance(true)Fragment?文档几乎不存在,这似乎是一个非常重要的功能.具体来说,我想知道这个序列(我编造的)有多少是真的:

  1. 用户旋转设备.
  2. 该片段从分离ActivityFragment.onDetach()被调用.
  3. 活动被摧毁; Activity.onDestroy()叫做.
  4. 所述Activityjava对象被删除(如果可能,通过GC).
  5. Activity创建一个新的java对象; 它的构造函数,并被onCreate()调用.
  6. Activity.onCreate()我们要么setContentView(...)设置包含片段的布局,要么我们FragmentTransaction 用来添加片段.
  7. 我真的不确定这一点,但我认为android很聪明,可以找到旧的片段,并呼吁Fragment.onAttach()将它重新连接到新的Activity
  8. Activity.onResume()调用下一个(或之前?谁知道?).

那是对的吗?即使我FragmentTransaction.add(new MyFragment(), ...)第一次明确使用,Android是否足够智能找到旧片段?如果是这样,我如何避免添加另一个片段onCreate()?我需要做这样的事吗?:

    if (getSupportFragmentManager().findFragmentByTag("foo") == null)
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(new FooFragment(), "foo").commit();
    }
Run Code Online (Sandbox Code Playgroud)

android rotation android-fragments android-activity

103
推荐指数
2
解决办法
5万
查看次数

为什么onResume()似乎被调用两次?

我在这里有我的Activity课程:

public class CameraActivity extends Activity {

private Camera mCamera;
private CameraPreview mPreview;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //      startCamera();
}

public void startCamera() {
    setContentView(R.layout.camera_view);
    mCamera = getCameraInstance();// Open Camera
    mPreview = new CameraPreview(this,mCamera);// Goto Another Class

    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.setLayoutParams(new FrameLayout.LayoutParams(400,400));

    //Declare Frame in which camera will be opened
    preview.addView(mPreview); // show this class into frame

}

protected void onResume() {
    super.onResume();
    Log.d("Print","resume()");
    startCamera();
}

public static Camera getCameraInstance() {
    Camera c = null;
    try …
Run Code Online (Sandbox Code Playgroud)

java android

8
推荐指数
1
解决办法
3104
查看次数

onLeScan在发现蓝牙设备时调用了两次

我试图发现蓝牙低能耗设备,但我有onLeScan方法的问题.它被调用两次,因此所有设备都加倍了.

我用来启动扫描的方法:

private void scanLeDevice(final boolean enable) {
        if (enable) {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    bluetoothAdapter.stopLeScan(getLeScanCallback());
                    scanning = false;
                }
            }, SCAN_PERIOD);

            scanning = true;
            bluetoothAdapter.startLeScan(getLeScanCallback());
        } else {
            bluetoothAdapter.stopLeScan(getLeScanCallback());
            scanning = false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

返回LeScanCallback的方法:

private BluetoothAdapter.LeScanCallback getLeScanCallback(){
        BluetoothAdapter.LeScanCallback leScanCallback =
                new BluetoothAdapter.LeScanCallback() {
                    @Override
                    public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi
                            , byte[] scanRecord) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Log.d(TAG, "device found");
                                Device device = new Device();
                                device.setName(bluetoothDevice.getName());
                                device.setAddress(bluetoothDevice.getAddress());
                                devices.add(device); …
Run Code Online (Sandbox Code Playgroud)

android bluetooth bluetooth-lowenergy

1
推荐指数
1
解决办法
873
查看次数