web-dev-qa-db-de.com

Aktivitätsinstanz abrufen

Entschuldigen Sie mich für eine einfache Frage, ich bin ein Anfänger von Java und Android-Entwicklern. Wie kann ich die Instanz von Activity in setCameraDisplayOrientation abrufen, wenn surfaceChanged aufgerufen wird? 

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

So vermeiden Sie Speicherverluste mithilfe einer statischen Variablen: Machen Sie einen statischen schwachen Verweis auf die Activity-Instanz, die in der Methode onCreate (Bundle) festgelegt wird.

  1. Schreiben Sie in Ihrer Sekundärklasse etwas wie folgt:

    public Class SecondClass {
        private static WeakReference<Activity> mActivityRef;
        public static void updateActivity(Activity activity) {
            mActivityRef = new WeakReference<Activity>(activity);
        }
    
  2. Dann in der onCreate (Bundle) -Methode Ihrer Activity-Klasse:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. Verwenden Sie die Aktivitätsinstanz folgendermaßen:

    mActivityRef.get()
    
Activity a = (Activity) getContext();

Solange Sie die aktuelle Aktivität als Kontext im Konstruktor übergeben, wie Sie dies bereits tun.

8
ivagarz

Ich setze einfach eine Variable in meiner Hauptaktivität ein ... public static Activity activity = this;, dann kann ich sie von überall her referenzieren mit: MainActivity.activity.

Sie können es auch in der onCreate () - Methode festlegen. Setzen Sie die Variable oben in Ihrer Hauptaktivitätsklasse wie folgt auf public static Activity activity; und fügen Sie in der onCreate () - Methode einfach activity = this; an einer beliebigen Stelle hinzu.

Dies funktioniert für jede Klasse, die Activity erweitert, z. B. public class MainActivity extends Activity. Sie können die Variable jedoch auch von jeder Klasse aufrufen, auch wenn sie Activity nicht erweitert.

Hoffe das hilft.

4
Luke Alderton

Die Methode this.getParent() funktioniert.

0
Gabriel Marques