Получить экземпляр активности - PullRequest
21 голосов
/ 15 марта 2012

Простите за простой вопрос, я полностью начинающий Java и Android-разработчик. Как я могу получить экземпляр Activity в setCameraDisplayOrientation при вызове SurfaceChanged?

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

Ответы [ 4 ]

27 голосов
/ 19 марта 2015

Вот способ избежать утечек памяти с использованием статической переменной: сделайте статическую слабую ссылку на экземпляр Activity, который будет установлен в методе onCreate (Bundle).

  1. Запись в ваш вторичный классчто-то вроде ниже:

    public Class SecondClass {
        private static WeakReference<Activity> mActivityRef;
        public static void updateActivity(Activity activity) {
            mActivityRef = new WeakReference<Activity>(activity);
        }
    
  2. Затем в методе onCreate (Bundle) вашего класса Activity:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
  3. Используйте экземпляр действия thisпуть:

    mActivityRef.get()
    
8 голосов
/ 03 октября 2013
Activity a = (Activity) getContext();

Пока вы передаете текущую активность в качестве контекста в конструкторе, как вы уже делаете.

4 голосов
/ 11 ноября 2012

Я просто установил переменную в своей основной деятельности следующим образом ... public static Activity activity = this;, тогда я могу ссылаться на нее из любого места, используя: MainActivity.activity.

Вы также можете установить его в методе onCreate (), просто установите переменную в верхней части основного класса активности, как это public static Activity activity;, затем в методе onCreate () просто добавьте activity = this; в любом месте.

Это будет работать для любого класса, расширяющего Activity, например, public class MainActivity extends Activity, однако вы можете вызывать переменную из любого класса, даже если они не расширяют Activity.

Надеюсь, это поможет.

0 голосов
/ 18 июня 2018

Метод this.getParent() работает.

...