web-dev-qa-db-fra.com

Obtenir une instance d'activité

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);
        ....
    }
    }
}
20
psct

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).

  1. 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);
        }
    
  2. Ensuite, dans la méthode onCreate (Bundle) de votre classe d'activité:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. 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à.

8
ivagarz

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.

4
Luke Alderton

La méthode this.getParent() fonctionne.

0
Gabriel Marques