Excusez-moi pour une simple question, je suis un développeur débutant pour Java et Android. Comment obtenir l'instance d'activité dans setCameraDisplayOrientation lorsque surfaceChanged est appelé?
public class MyActivity extends Activity
{
private Camera mCamera;
private CameraPreview mPreview;
public final int cameraId = 0;
public Activity activity = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
activity = this;
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
}
public void setCameraDisplayOrientation(Activity activity,
int cameraId, Android.hardware.Camera camera) {
}
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
...
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
...
setCameraDisplayOrientation(activity, cameraId, mCamera);
....
}
}
}
Voici un moyen d'éviter les fuites de mémoire en utilisant une variable statique: faites une référence statique faible à l'instance d'activité qui sera définie dans la méthode onCreate (Bundle).
Ecrivez dans votre classe secondaire quelque chose comme ci-dessous:
public Class SecondClass {
private static WeakReference<Activity> mActivityRef;
public static void updateActivity(Activity activity) {
mActivityRef = new WeakReference<Activity>(activity);
}
Ensuite, dans la méthode onCreate (Bundle) de votre classe d'activité:
@Override
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SecondClass.updateActivity(this);
...
}
Utilisez l'instance d'activité de cette façon:
mActivityRef.get()
Activity a = (Activity) getContext();
Tant que vous transmettez l'activité actuelle en tant que contexte dans le constructeur, comme vous le faites déjà.
Je viens de définir une variable dans mon activité principale comme suit ... public static Activity activity = this;
, puis je peux la référencer de n'importe où en utilisant: MainActivity.activity
.
Vous pouvez également le définir dans la méthode onCreate (); il vous suffit de configurer la variable en haut de votre classe d'activité principale comme ceci public static Activity activity;
puis dans la méthode onCreate (), ajoutez simplement activity = this;
n'importe où.
Cela fonctionnera pour toute classe qui étend Activity, par exemple public class MainActivity extends Activity
. Cependant, vous pouvez appeler la variable depuis n'importe quelle classe même si elles ne prolongent pas Activity.
J'espère que cela t'aides.
La méthode this.getParent()
fonctionne.