나는 안드로이드에 @Override 의 목적을 알고 싶어요.

1.


자바 주석을 @Override. 다음과 같은 방법을 다치게 컴파일러는 슈퍼 클래스의 메소드를 오버라이드 (override) 지시합니다. 예를 들어, 당신은 Person 클래스를 구현 말한다.

public class Person {
   public final String firstName;
   public final String lastName;

   //some methods

   @Override public boolean equals(Object other) {
      ...
   }
}

Person 클래스() 메소드가 있습니다. equals 메소드는 이미 사람의 슈퍼 클래스 객체에 정의되어 있습니다.

따라서 equlas 구현 () 명 public ()을 재정의한다. 즉,  (사람)를 재정의합니다.


명시적으로 재정의하지 않고 메서드를 재정의하는 것이 합법적입니다. 

따라서 @Override의 주석이 무엇을 의미합니까?

실수로 다음과 같은 방식으로 재정의하려고 하면 어떻게 됩니까?

public boolean equals(Person other) {
   ...
}

위의 경우에는 버그가 있다. 당신은 동등하게 재정의하려 했지만 당신은 그렇지 않았다.

왜요? () 같은 등식은 매개 변수를 매개 변수로 얻고 당신의 equals()을 매개 변수로 얻는다.


컴파일러가 당신이 오버 라이드 하고 싶어 하는 것을 알지 못했기 때문에 컴파일러는 당신에게 그 버그에 대해 알려 주지 않을 것이다.


컴파일러가 알 수 있는 한, 당신은 실제로 과부하를 의미한다. 


하지만 재정의를 사용하려고 시도한 경우에는 다음과 같은 항목을 사용합니다.

@Override public boolean equals(Person other) {
   ...
}

이제 컴파일러는 오류가 있다는 것을 알고 있다. 너는 무시하고 싶었지만 그렇지 않았다. 

따라서@재정의 주석을 사용하는 이유는 방법을 명시적으로 선언하는 것입니다.




2.

컴파일러가 super class에서 메서드를 재정의하도록 고안되었음을 컴파일러에게 알려 주는 자바 주석은 말할 것도 없다. 그것은 엄격히 필요하지는 않지만 컴파일 시 오류를 잡아내는 데 도움이 된다.


3.

@Override는 자바 스크립트입니다.

또한 슈퍼 클래스의 메소드 선언을 오버라이드 (override)하는 상처를 메소드 선언을 나타냅니다. 방법이 주석 형의 주석을 붙일 수 있지만, 슈퍼 클래스 메소드를 오버라이드 (override)하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.


Example:

class Parent{
    public void foo(){

    }
}

class Child extends Parent{
    //compile perfect !
    @override
    public void foo(){

    }
    //will show compile time error message here as it is not being overridden 
    @override
    public void foo(int i){

    }

}



출처 : https://stackoverflow.com/questions/4736212/meaning-of-android-override

Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.


Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.

요청에 의해 호출된 앱에서 다양한 섹션(탐색 드로어에 있는)을 선택할 때마다 다양한 종류의 Content URIs가 반환됩니다.

갤러리(앱)섹션의 선택 항목에서 얻을 수 있는 것은 다음과 같습니다.

Recents(또는 일반적으로 내 생각)에서는 다음과 같은 이점을 얻을 수 있습니다.

GoogleDrive에서 선택할 때는 다음과 같은 URI를 사용합니다.

또한 사진(앱)섹션에서 다음을 수행합니다(URL인코딩됨).





버튼 위치 내가 원하는 곳에 설정하기

처음 만들면 스튜디오 안에서는 정상작동하나, 핸드폰을 활용할 시 error문구와 함꼐 0,0으로 이동이 됩니다.

<Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="62dp"
        tools:layout_editor_absoluteY="310dp" />


이 구문을 

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.291" />

와 같이 설정하고, 디자인 부분에서 위치를 조절해준다면 원하는 위치에 배열할 수 있습니다.





Q

사람들이 'public static final String mystring = ~~~' 을 작성한 다음 많은 값을 사용하는 코드를 보았습니다.


왜 그들은 그것을해야하나요? 왜 그들은 그것을 사용하기 전에 최종 값으로 초기화해야합니까?

그 핵심 (public static final)의 의미를 이해합니다.

내가 이해하지 못하는 것은 상수가 

한 곳에서만 사용되고 같은 클래스에서만 사용 되더라도 사람들이 왜 그것을 사용하는지에 대한 것입니다. 

그것을 선언하는 이유는 무엇입니까? 왜 우리는 변수를 사용하지 않습니까?


A

final은 변수의 값이 변경되지 않음을 나타냅니다. 즉, 값을 선언 한 변수는 선언 된 후에 수정할 수 없습니다.


public final static String 을 사용하면 다음과 같은 String을 만들 수 있습니다.

1. 클래스 (static : 그것을 사용하는 데 필요한 인스턴스가 없음)에 속하며,

2. 클래스의 모든 인스턴스와 클래스를 사용하는 다른 객체에서 사용할 수있는
   String 상수를 정의하려는 경우와 같이 변경되지 않습니다 (final).


ex)

public final static String MY_CONSTANT = "SomeValue";

// ... 다른 코드에서 다른 객체에 상수를 사용합니다.
if (input.equals(MyClass.MY_CONSTANT)

비슷하게

public static final int ERROR_CODE = 127;


즉,

final을 사용할 필요는 없지만 프로그램 실행 중에 실수로 변경되는 상수를 유지하고 변수가

상수라는 표시기로 사용됩니다.


final 상수가 현재 클래스 및 또는 한 곳에서만 사용되는 경우에도 모든 상수를 최종으로 선언하는 것이 좋습니다.

final : 코드의 수명이 다할 때까지 상수가 여러 곳에서 사용될 수 있습니다.

또한 final을 사용하면 구현시 일부 최적화를 수행 할 수 있습니다.




+ 다른 답변 해석

static 이란 클래스를 인스턴스화하거나 객체를 사용하지 않고도 사용할 수 있습니다.

final은 문자열 상수를 만드는데 사용되는 키워드입니다. 해당 문자열의 값은 변경할 수 없습니다.

 아래 예를보세요.

  public class StringTest { 
           static final String str = "Hello"; 
  public static void main(String args[]) { 
           // str = "world"; // 주석을 해제하면 에러가 발생할 것입니다.
           System.out.println(str); // called without the help of an object                       
           System.out.println(StringTest.str);// called with class name  
             } 
         } 


안드로이드 스튜디오 빌드 중 갑자기 에러가 발생되었다. 

에러 문구는 아래와 같다.



"...Crunching Crunsher ...png failed"


클린 프로젝트 및 리 빌드를 해도


같은 에러가 반복된다...



나의 에러 수정 방법은 매우 간단하였다...


폴더의 폴더의 폴더로 들어간 경로를 단순하게


폴더 길이를 줄여서 짧게 바꾸고, 빌드 시켰더니 해결..


ex : 


from:

D:/Android/Apps/AndroidStudioProject/AppName

to

D:/Android/AppName


에러의 원인이 Android studio 에서 파일명이 일정길이 넘어가면 참조를 할 수 없는 것 같다.

+ Recent posts