어댑터 뷰

화면에 동적으로 변경되는 컨텐츠를 채울 때 사용하는 뷰

리스트 뷰

항목들을 수직 방향의 목록 형태로 보여주는 어댑터 뷰 - 상하 스크롤 가능 - 일반적으로 목록의 한 항목을 선택하여 일정한 작업 수행

생성 방법1 - element

  1. 레이아웃 파일에 ListView element 를 선언한다.

  2. 액티비티 파일에 어댑터를 생성한다.

  3. 생성한 어댑터를 레이아웃 파일에 선언한 ListView 리소스와 연결시킨다.

public class MainActivity extends AppCompatActivity {
  private ListView m_ListView;
  private ArrayAdapter<String> m_Adapter;
 
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    String[] values = {"String1", "String2", "String3"};
 
    m_Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
 
    m_ListView = (ListView)findViewById(R.id.list);
 
    m_ListView.setAdapter(m_Adapter);
 
    m_ListView.setOnItemClickListener(onClickListItem);
  }
 
  private AdapterView.OnItemClickListener onClickListItem = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      Toast.makeText(getApplicationContext(), m_Adapter.getItem(position), Toast.LENGTH_SHORT).show();
    }
  };
}

ListView 아이템 터치시 이벤트를 처리할 리스너를 구현해야 한다.

private AdapterView.OnItemClickListener onClickListItem = new AdapterView.OnItemClickListener() {
 
  @Override
  public void onItemClick<AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(getApplicationContext(), m_Adapter.getItem(position), Toast.LENGTH_SHORT).show();
  }
};

생성 방법2 - ListActivity 상속

  1. 액티비티에 ListActivity를 상속 받는다.

  2. 어댑터를 생성한다.

  3. setListAdapter 라는 ListActivity에 선언한 함수를 사용하여 어댑터를 액티비티에 설정한다.

public class MainActivity extends ListActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
 
        String[] values = {"하스스톤", "몬스터 헌터", "디아블로", "와우", "리니지", "안드로이드", "아이폰"};
 
        // Android에서 제공하는 표준 레이아웃에 String 문자열 하나를 출력하는 layout으로 어댑터 생성
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
 
        // ListView에 어댑터 연결
        setListAdapter(adapter);
    }
 
    @Override
    protected void onListItemClick(ListView l, View view, int position, long id) {
        String item = (String)getListAdapter().getItem(position);
        Toast.makeText(getApplicationContext(), item + " selected", Toast.LENGTH_SHORT).show();
    }
}

직접 AdapterView의 리스너를 선언하여 구현 및 설정하였던 생성방법 1과 달리 ListActivity를 상속받게 되면 아래와 같은 함수를 사용할 수 있다.

setListAdapter(adapter);
 
@Override
protected void onListItemClick(ListView l, View view, int position, long id);

생성 방법 1과 달리 주의 깊게 봐야할?점은 아래의 코드 같다.

super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);


'IT > Android' 카테고리의 다른 글

Popup Menu 생성  (0) 2017.10.23
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Intent  (0) 2017.10.23
Action Bar  (0) 2017.10.23
Dialog  (0) 2017.10.23

Popup menu

특정 뷰에 고정된 모달 메뉴이다.

@Override
    public void onClick(View view) {
        PopupMenu popup = new PopupMenu(this, view);
 
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.actions, popup.getMenu());
 
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                if(item.getItemId()==R.id.apple) {
 
                } else if(item.getItemId()==R.id.grape) {
 
                }
                return false;
            }
        });
        popup.show();
    }

해당 위젯 클릭시 PopupMenu 를 생성한다.

'IT > Android' 카테고리의 다른 글

리스트 뷰  (0) 2017.10.31
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Intent  (0) 2017.10.23
Action Bar  (0) 2017.10.23
Dialog  (0) 2017.10.23

AlertDialog를 이용하여 RatingBar 띄우기

class MyOnLongClickListener implements View.OnLongClickListener {
    @Override
    public boolean onLongClick(View view) {
        if(view.getId()==R.id.button3) {
            showDialog();
            return true;
        }
        return false;
    }
}

LongClick 후에 RatingBar를 띄우기 위해 다음과 리스너를 생성한다.

public void showDialog() {
        final AlertDialog.Builder popDialog = new AlertDialog.Builder(this);
        final RatingBar ratingBar = new RatingBar(this);
        ratingBar.setMax(5);
 
        popDialog.setTitle("RatingBar");
        popDialog.setView(ratingBar);
 
        popDialog.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.cancel();
                            }
                        });
 
        popDialog.create();
        popDialog.show();
    }

AlertDialog.Builder에는 AlertDialog에 생성에 필요한 API를 제공하고 있다. setPositiveButton과 setNegativeButton을 이용하여 OK/Cancle 버튼을 버튼을 만든다.

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actions, menu);
        return true;
    }

onCreateOptionsMenu 함수를 이용하게 되면 코드로 옵션 메뉴를 생성할 수 있다. 하지만 먼저 menu 리소스가 필요하다.

'IT > Android' 카테고리의 다른 글

리스트 뷰  (0) 2017.10.31
Popup Menu 생성  (0) 2017.10.23
Intent  (0) 2017.10.23
Action Bar  (0) 2017.10.23
Dialog  (0) 2017.10.23

Intent

다른 apllication component가 어떤 action을 수행하도록 요청하기 위해 사용되는 메시징 객체.

대표적인 use cases - Activity를 시작 - Service를 시작 - Broadcast를 전달

명시적 인텐트

실행하고자 하는 component의 이름을 명시적으로 지정하여 호출한다. > 같은 앱 내의 다른 액티비티에 접근하고 할 때 명시적 인텐트를 사용한다.

//MainActivity.java
 
Intent intent = new Intent(this, SubActivity.class);
startActivity(intent);

Intent 객체 선언 후 startActivity를 통해 Intent에 명시된 액티비티를 시작한다. 위의 코드에서는 호출한 액티비티로부터 반환값을 받지 않는다.

//MainActivity.java
 
Intent in = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(in, GET_STRING);

startActivityForResult를 사용하게 되면 호출한 액티비티로부터 반환 값을 받을 수 있다.

//SubActivity.java
 
Intent intent = new Intent();
 
intent.putExtra("key", "value");
 
setResult(RESULT_CANCELED);

호출된 액티비티에서 인텐트에 데이터를 담아 setResult함수를 통해 반환값을 보낼 수 있다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == GET_STRING) {
        if(resultCode == RESULT_OK) {
            text.setText(data.getStringExtra("INPUT_TEXT"));
        } else if(resultCode == RESULT_CANCELED) {
            //
        }
    } else if(requestCode == GET_NUMBER) {
        //
    }
}

onActivityResult를 통해 반환 값을 받을 수 있다.

namevalue
requestCodestartActivityForResult가 호출할 때 넘겨준 코드
resultCode실행이 되어진 액티비티에서 setResult 메소드를 통해 반환되는 코드
data엑스트라 데이터를 담는 Intent 객체

암시적 인텐트

자신이 작성한 어플리케이션이 아닌 다른 어플리케이션의 component를 구동하는데 사용된다.

각 component는 자신이 처리할 수 있는 인텐트의 종류를 인텐트 필터 를 사용하여 안드로이드 운영체제에 알려줘야 한다. > 어떤 앱에서 액티비티나 서비스 등의 component를 외부에 공개하고자 할 때 인텐트 필터를 지정한다. 그렇지 않은 경우에는 인텐트 필터를 지정하지 않으면 된다.(암시적 인텐트 허용 않음)

Intent(String action, Uri uri)
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://wwww.google.com"));

위와 같이 액션 수행시 필요한 데이터를 Uri 클래스의 객체로 제공한다. > Uri란 어떤 자원에 접근하기 위한 유일한 식별자를 의미. 일반적으로 URL과 URN을 포괄하는 개념으로 URL을 통해 프토토콜, 도메일, 자원의 위치정보를 얻고 URN을 통해 자원의 위치와 무관한 영속적인 유일환 자원의 정보를 얻는다.

if(intent != null) {
  if(intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }
}

startActivity(intent) 로 암시적 인텐트를 시작한다.  intent.resolveActivity()의 의미는 null이 아닌 경우 처리할 앱이 최소한 하나가 있다는 의미이다.

  • 인텐트 액션 종류

namevalue
ACTION_VIEW데이터를 사용자에게 표시
ACTION_EDIT사용자가 편집할 수 있는 데이터를 표시
ACTION_MAIN태스크의 초기 액티비티로 설정
ACTION_CALL전화 통화 시작
ACTION_SYNC모바일 장치의 데이터를 서버 상의 데이터와 일치시킨다
ACTION_DIAL전화 번호를 누르는 화면을 표시
ACTION_SENDTO이메일 발송
//AndroidManifest.xml
 
<application
     android:allowBackup="true"
     android:icon="@mipmap/ic_launcher"
     android:label="@string/app_name"
     android:supportsRtl="true"
     android:theme="@style/AppTheme">
     <activity android:name=".MainActivity">
         <intent-filter>
             <action android:name="android.intent.action.MAIN" />
 
             <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
     </activity>
 
     <activity
        android:name=".SecondActivity"
        android:label="@string/app_name_second">
 
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="image/*"
        </intent-filter>
     </activity>
</application>

위의 MainActivity에 설정된 intent-filter는 실행시키는 앱의 메인 시작점이기 때문에 action.MAIN과 category.LAUNCHER가 기본적으로 설정된다.

추가한 SecondActivity를 살펴보자.

기본적으로 인텐트 필터 매칭은 액션 / 카테고리 / 데이터 비교로 이루어진다.

  1. 액션

    • 인텐트 객체에 설정된 액션은 인텐트 필터에 나열된 액션 중 하나와 반드시 일치해야 한다.

  2. 카테고리

    • 인텐트 객체에 포함된 모든 카테고리가 인테트 필터에 나열되어 있어야 한다.

    • startActivity, startActivityForResult 로 전달되는 모든 암시적 인텐트는 android.intent.category.DEFAULT 카테고리에 속하는 것으로 자동 설정한다. -> 암시적 인테트를 받고자 하는 액티비티는 반드시 default category를 포함해야 한다.

  3. 데이터

    • 데이터 타입이나 URI가 지정한 대로 똑같이 매칭이 된 경우에만 통과된다.


'IT > Android' 카테고리의 다른 글

Popup Menu 생성  (0) 2017.10.23
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Action Bar  (0) 2017.10.23
Dialog  (0) 2017.10.23
context menu  (0) 2017.10.23

Action bar

안드로이드 상단에 출력되는 디자인 요소

아래와 같은 용도로 사용된다.

  • 앱의 아이덴티티를 부여하는 공간 제공 (앱 아이콘, 로고)

  • 검색과같은중요기능을눈에띄게함

  • 앱 내에서 일관된 내비게이션과 뷰 전환을 지원함 - 탭, 드롭다운 메뉴

  • 별로 사용하지 않는 액션을 액션 오버플로우로 제공하여 산만함을 줄임

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actions, menu);
        return super.onCreateOptionsMenu(menu);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.action_refresh:
                Toast.makeText(getApplicationContext(), "refresh", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_search:
                Toast.makeText(getApplicationContext(), "search", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_settings:
                Toast.makeText(getApplicationContext(), "settings", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

onOptionsItemSelected를 사용하여 각 메뉴에 대한 이벤트를 설정한다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 
    <item
        android:id="@+id/action_refresh"
        android:title="refresh"
        app:showAsAction="always|withText"
        />
 
    <item
        android:id="@+id/action_search"
        android:title="search"
        app:showAsAction="never"
        />
 
    <item
        android:id="@+id/action_settings"
        android:title="settings"
        app:showAsAction="always"
        />
</menu>

menu 리소스의 xml파일은 위와 같다.

app:showAsAction 옵션을 사용하기 위해 위에 보이는 xmlns:app을 선언해줘야 한다.

각 설정 타입의 내용은 아래와 같다.

name설명
ifRoom액션 아이템을 표시할 수 있는 공간이 있다면 액션 아이템을 표시합니다.
never항상 액션 아이템으로 표시하지 않습니다. (기본값)
withText메뉴 항목의 아이콘과 메뉴 항목의 텍스트를 함께 액션 아이템으로 표시합니다.
always항상 액션 아이템으로 표시합니다.

표시되지 않은 메뉴항목에 대해서는 오른쪽에 오버플로우 메뉴로 합쳐지게 된다.

참고링크 : 커니의 안도로이드 이야기

'IT > Android' 카테고리의 다른 글

Popup Menu 생성  (0) 2017.10.23
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Intent  (0) 2017.10.23
Dialog  (0) 2017.10.23
context menu  (0) 2017.10.23

Dialog

사용자에게 메시지를 출력하고 사용자로부터 입력을 받는 인터페이스

AlertDialog • DatePickerDialog / TimePickerDialog

AlertDialog

AlertDialog는 Activity 클래스를 이용해서 구현할 수 있다.

public class MainActivity extends AppCompatActivity {
    Button mButton1;
 
    private static final int DIALOG_YES_NO_MESSAGE = 1;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mButton1 = (Button)findViewById(R.id.button1);
        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog(DIALOG_YES_NO_MESSAGE);
            }
        });
    }

showDialog()를 통해 대화상자를 호출한다.

    @Override
    protected Dialog onCreateDialog(int id) {
        switch(id) {
            case DIALOG_YES_NO_MESSAGE:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("메시지")
                        .setMessage("종료하시겠어요?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                finish();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.dismiss();
                            }
                        });
 
                AlertDialog alert = builder.create();
                return alert;
        }
        return null;
    }
}

onCreateDialog는 showDialog 함수 호출시 호출되는 메소드이다. AlertDialog.Builder를 통해 대화상자를 설정하고 builder.create()를 통해 설정된 값으로 대화상자를 생성한다.

DialogFragment를 이용하여 AlertDialog 구현하기

Activity 클래스를 이용하는 것 외에 DialogFragment를 이용하는 방식이 있다.

public static class ButtonDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("메시지")
                    .setMessage("종료하시겠어요?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            getActivity().finish();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    });
 
            return builder.create();
        }
    }

내부적으로 DialogFragment를 상속받는 내부 클래스를 선언하였다.

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 
//...
 
getActivity().finish();

첫번째 방법과 다른 점은 this 부분이 getActivity()로 바꼇다는 점이다.

mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DialogFragment dialogFragment = new ButtonDialogFragment();
                dialogFragment.show(getSupportFragmentManager(), "test");
            }
        });

해당 리소스에 리스너를 등록한다. 이 때 getSupportFragmentManager()를 이용하여 FragmentManager를 가져온다.(지원 라이브러리 사용할 경우)

DatePickerDialog

DialogFragment를 이용하여 구현한다.

public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
        TextView mT;
 
        public void setEditText(TextView et) {
            mT = et;
        }
 
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Calendar cal = Calendar.getInstance();
 
            return new DatePickerDialog(getActivity(), this, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
        }
 
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            mT.setText(year + "/" + (monthOfYear + 1) + "/" + dayOfMonth);
        }
    }

onCreateDialog와 onDateSet 함수를 사용한다.

DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener listener, int year, int month, int dayOfMonth)

Button bt = (Button) findViewById(R.id.button);
 
        // 버튼을 클릭했을 때 대화상자를 표시하도록 처리
        // OnClickListener를 설정(무명클래스로 이벤트 리스너 객체를 생성하는 방식)하고 onClick 메소드 구현
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView editText = (TextView) findViewById(R.id.dateText);
 
                DatePickerFragment dpf = new DatePickerFragment();
                dpf.setEditText(editText);
                dpf.show(getFragmentManager(), "datePicker");
            }
        });


'IT > Android' 카테고리의 다른 글

Popup Menu 생성  (0) 2017.10.23
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Intent  (0) 2017.10.23
Action Bar  (0) 2017.10.23
context menu  (0) 2017.10.23

Context Menu

Context 메뉴란 UI에서 특정한 항목에 영향을 주는 동작을 선택할 수 있는 메뉴를 말한다.

Context 메뉴 생성방법은 크게 2가지가 있는데 floating context menu, context action menu 이다. 각 메뉴 생성방법에 대해 알아보자.

Floating Context Menu

화면을 long click 하면 나타나는 방식이다.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mButton1 = (Button)findViewById(R.id.button1);
 
        registerForContextMenu(mButton1);
    }

registerForContextMenu에 해당 위젯을 등록시킨다.

    //floating context menu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
 
        menu.setHeaderTitle("Context menu");
        menu.add(0, 1, 0, "apple");
        menu.add(0, 2, 0, "grape");
    }

onCreateContextMenu는 Context 메뉴를 보여줘야 할 시점에 호출된다.

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                return true;
            case 2:
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

onContextItemSelected는 메뉴 이벤트 처리함수이다.

Context Action Mode

Context Action Mode를 구현하기 위해서는 View.OnLongClickListener, ActionMode.Callback 인터페이스르 구현해야 한다.

ActionMode 인터페이스를 구현하기 위해서는 아래의 4개의 메소드를 오버라이딩 해야 한다.

  ActionMode mActionMode;
 
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
 
        inflater.inflate(R.menu.actions, menu);
 
        return true;
    }

onCreateActionMode는 startActivity가 호출될 때 호출되는 콜백 메소드

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

onPrepareActionMode는 액션모드를 refresh하는 목적으로 아무것도 하지 않으면 false, 액션 메뉴가 업데이트되면 true 반환

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch(item.getItemId()) {
            case R.id.apple:
                mode.finish();
                return true;
            case R.id.grape:
                mode.finish();
                return true;
            default:
                return false;
        }
    }

onActionItemClicked는 사용자가 액션 메뉴의 항목을 클릭했을 때 호출

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }

onDestroyActionMode는 액션 모드를 종료시켰을 때 호출

@Override
public boolean onLongClick(View view) {
    if(mActionMode!=null) {
        return false;
    }
 
    mActionMode = this.startSupportActionMode(this);
    view.setSelected(true);
    return true;
}

리스너를 등록한 위젯에서 LongClick시 ActionMode를 실행시키기 위해 startSupportActionMode를 사용하여 컨텍스트의 액션 모드를 실행한다.

'IT > Android' 카테고리의 다른 글

Popup Menu 생성  (0) 2017.10.23
AlertDialog를 이용하여 RatingBar 띄우기  (0) 2017.10.23
Intent  (0) 2017.10.23
Action Bar  (0) 2017.10.23
Dialog  (0) 2017.10.23

+ Recent posts