簡體   English   中英

如何從 class 擴展 LinearLayout 訪問相機?

[英]how to access the camera from class extending LinearLayout?

對不起,我是 java 新手,我需要使用 class 擴展 LinearLayout 的相機。

public class ImagePicker extends LinearLayout {

...

            mButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    try{
                        startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                    }catch (ActivityNotFoundException e){
                        e.printStackTrace();
                    }
                }
            });

...
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
             
  
        }

這些方法需要一個 class 擴展 Activity。 我怎樣才能正確使用它們? 謝謝

有(至少)兩種選擇可以實現這一目標:

  • 您可以按照 stackoverflow.com/a/32973351/3738870 中的說明從 ImagePicker 獲取活動。 但是,這種方法不太干凈,因為 Intent 是在ImagePicker中發送的,但結果仍然必須在ActivityonActivityResult中接收。 最好從您請求的地方接收相同的 class 的結果。
  • 另一種方法是暴露按鈕,然后在 Activity 中調用它的setOnClickListener 下面是一些示例代碼,演示了如何執行此操作:

ImagePicker

    public class ImagePicker extends LinearLayout {
    
        private Button button;
    
        public ImagePicker(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            View.inflate(context, R.layout.image_picker, this);
            button = findViewById(R.id.button);
        }
    
        public Button getButton() {
            return button;
        }
    }

Activity

    public class Activity extends AppCompatActivity {
    
        private static int REQUEST_TAKE_PHOTO = 99;
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
            super.onCreate(savedInstanceState, persistentState);
            setContentView(R.layout.activity_main2);
    
            ImagePicker imagePicker = findViewById(R.id.imagePicker);
            imagePicker.getButton().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    try{
                        startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                    }catch (ActivityNotFoundException e){
                        e.printStackTrace();
                    }
                }
            });
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

一個更簡單的解決方案是直接在 Activity 中獲取 Button:

public class Activity extends AppCompatActivity {

    private static int REQUEST_TAKE_PHOTO = 99;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.activity_main2);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                try{
                    startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
                }catch (ActivityNotFoundException e){
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM