什么究竟,当你调用发生setRetainInstance(true)在Fragment?文档几乎不存在,这似乎是一个非常重要的功能.具体来说,我想知道这个序列(我编造的)有多少是真的:
- 用户旋转设备.
- 该片段从分离
Activity和Fragment.onDetach()被调用.- 活动被摧毁;
Activity.onDestroy()叫做.- 所述
Activityjava对象被删除(如果可能,通过GC).Activity创建一个新的java对象; 它的构造函数,并被onCreate()调用.- 在
Activity.onCreate()我们要么setContentView(...)设置包含片段的布局,要么我们FragmentTransaction用来添加片段.- 我真的不确定这一点,但我认为android很聪明,可以找到旧的片段,并呼吁
Fragment.onAttach()将它重新连接到新的ActivityActivity.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) 我在这里有我的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) 我试图发现蓝牙低能耗设备,但我有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)