ProgressDialog 예제

|

ProgressBar는 로딩 등과 같이 어떤 작업이 수행되고 있다는 것을 사용자에게 알려주기 위한 UX 컴포넌트입니다. 원형, 선형 등과 같이 다양한 형태의 ProgressBar가 존재합니다. 그리고 이러한 ProgressBar를 Dialog 형태인 ProgressDialog로도 보여줄 수 있습니다.

좀 더 자세한 정보는 여기를 참조하시면 됩니다.


예제 코드

private ProgressDialog mProgressDialog;

private void showProgressDialog(String message) {
  closeProgressDialog();
  mProgressDialog = new ProgressDialog(this);
  mProgressDialog.setTitle("");
  mProgressDialog.setMessage(message);
  mProgressDialog.setCancelable(true);
  mProgressDialog.setIndeterminate(true);
  mProgressDialog.show();
}

private void closeProgressDialog() {
  if((mProgressDialog != null) && (mProgressDialog.isShowing())) {
    mProgressDialog.dismiss();
  }
  mProgressDialog = null;
}

AlertDialog 예제

|

안드로이드에서 간단한 AlertDialog를 띄우는 예제 코드입니다.

좀 더 자세한 정보와 예제 코드는 여기를 참조하시면 됩니다.

예제 코드

package com.lnc.datacafe;


import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;

public class MainActivity extends Activity {

  private AlertDialog mAlertDialog;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    showAlertDialog();
  }

  private void showAlertDialog() {
    if(mAlertDialog != null) {
      mAlertDialog.dismiss();
      mAlertDialog = null;
    }

    mAlertDialog = new AlertDialog.Builder(this)
        .setTitle("여기에 Title을 입력하세요.")
        .setMessage("여기에 Message를 입력하세요")
        .setCancelable(true)
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            // TODO
          }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();
          }
        }).create();

    mAlertDialog.show();
  }

}

Windows 10 - 설치할 프로그램들

|

Windows 10 - 설치할 프로그램들

개인적으로 구매해서 사용하는 프로그램들이나 실생활 또는 개발시 유용하게 사용하는 프로그램들입니다.

  • JDK 설치 : 개발을 위한 필수 환경. Eclipse나 Android Studio 등 대부분 JDK가 있어야 동작합니다.
  • 반디집 : 압축 프로그램
  • 꿀뷰 : 이미지 뷰어
  • PicPick : 화면 캡쳐 프로그램
  • 크롬 : 웹브라우저
  • 파이어폭스 : 웹브라우저. 크롬과 파이어폭스 중 선택
  • DropBox : 순전히 1password 때문에 사용하는 클라우드 저장소
  • 1Password : 비밀번호 관리 어플(유료)
  • Sublime Text : 텍스트 에디터(유료)
  • Atom : 텍스트 에디터
  • Visual Studio Code : 텍스트 에디터
  • MS Office 2016 Professional : 오피스(유료)
  • GitHub Desktop : 필수는 아니지만 있으면 좀 더 편리하게 GitHub를 사용할 수 있음
  • Git for Windows : 형상 관리 툴
  • D2Coding Font : 프로그래밍용 폰트
  • Everything : 엄청나게 강력한 파일 검색툴
  • 리디북스 : 리디북스 뷰어

Windows 10 - 설치 후 초반 세팅

|

Windows 10 - 설치 후 초반 세팅

Windows 10 초기화를 수십차례 했음에도 자꾸 잊어버리는 작업들이 있어서 메모 차원에서 간단히 정리해보았습니다. 어디까지나 제 개인적인 취향이나 설정에 치우친 글입니다.


윈도우 & 드라이버 업데이트

가장 필수적이며, 최우선으로 하도록 합시다.

모든 설정 → 업데이트 및 복구

에서 설정 및 최신 드라이버로 업데이트할 수 있습니다.


키보드 재입력 시간 조절

개인적으로 키보드 재입력 시간에 딜레이가 있으면 너무 답답해서 키보드 재입력 시간을 최소화 해주고 있습니다.

제어판 → 키보드

에서 설정할 수 있습니다.


OneDrive 사용 Off

한 때 OneDrive를 많이 사용했었는데, 너무 느리기도 하고 동기화로 인한 LTE 데이터 소진 등을 막기 위해서 요즘은 아예 끄고 다닙니다.

image

image


백그라운드 앱 Off

백그라운드 어플이 돌아가면 아무래도 CPU나 배터리 소모, 데이터 사용량이 증가할 수 밖에 없습니다. 꼭 필요한 서비스들(ex. 날씨 등)만 제외하고는 전부 Off로 하는 것이 좋습니다.

설정 → 개인 정보 → 백그라운드 앱

image


스토어 앱 추천 Off

설정 → 개인 설정 → 시작

image

만약 최근에 사용한 항목의 이력을 지우고 싶으시면 아래쪽에 있는 ‘시작 메뉴의 점프 목록 또는 작업 표시줄에 최근에 사용한 항목 표시’ 항목도 체크를 없애시면 됩니다.

Custom ListView 예제

|

Android에서 ListView 샘플입니다. ListView는 제일 많이 사용하는 UI 컴포넌트 중 하나이다보니 코드 재활용이 빈번합니다. 그래서 여기 템플릿으로 활용할 수 있는 예제를 하나 포스팅해봅니다. 참고로 GridView도 똑같은 방법으로 사용하면 됩니다.

ListView의 스크롤 속도를 부드럽고 빠르게 하기 위해서는 디자인 패턴 중 ViewHolder Pattern을 사용합니다. Android에서 XML에서 리소스를 읽어오는 findViewById 함수는 시간이 많이 걸리는 함수입니다. ViewHolder 패턴을 사용하면 최초에 한 번 findViewById 함수로 찾은 리소스를 Holder 안의 변수에 맵핑을 해놓아서 다음 번에 찾을 때 훨씬 빠르게 찾을 수 있습니다. (Cache와 같은 원리입니다.)

아래는 ViewHolder 패턴을 적용한 예제입니다.

item_view_log.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout_background"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="15dp"
  android:paddingRight="15dp"
  android:orientation="vertical">

  <TextView
    android:id="@+id/timestamp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="timestamp"
    android:textColor="@color/ics_theme_darkblue"
    android:textSize="14sp" />

  <TextView
    android:id="@+id/desc"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Description"
    android:textColor="@color/darkgray"
    android:textSize="14sp" />

</LinearLayout>


LogListAdapter.java

public class LogListAdapter extends BaseAdapter {

  private final Context mContext;
  private ArrayList<BaseInfo> mList;

  public LogListAdapter(Context context) {
    mContext = context;
  }

  public void refresh(ArrayList<BaseInfo> list) {
    mList = list;
    notifyDataSetChanged();
  }

  @Override
  public int getCount() {
    if(mList == null) {
      return 0;
    }

    return mList.size();
  }

  @Override
  public BaseInfo getItem(int position) {
    if(mList == null) {
      return null;
    }

    return mList.get(position);
  }

  @Override
  public long getItemId(int position) {
    if(mList == null) {
      return 0;
    }

    return position;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ItemHolder holder = null;
    View row = convertView;

    if(row == null) {
      LayoutInflater inflator = (LayoutInflater) mContext
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      row = inflator.inflate(R.layout.item_view_log, null);

      holder = new ItemHolder();

      holder.timestamp = (TextView) row.findViewById(R.id.timestamp);
      holder.desc = (TextView) row.findViewById(R.id.desc);

      row.setTag(holder);
    } else {
      holder = (ItemHolder) row.getTag();
    }

    final BaseInfo item = getItem(position);
    if(item != null) {
      if(item.getTimestamp() == 0) {
        holder.timestamp.setVisibility(View.GONE);
      } else {
        String timestamp = SnowTimeUtil
            .getTimeAsString(STRING_FORMAT.TIMESTAMP_FORMAT, item.getTimestamp());
        holder.timestamp.setText(timestamp);
        holder.timestamp.setVisibility(View.VISIBLE);
      }

      holder.desc.setText(item.toString());
    }

    return row;
  }

  class ItemHolder {

    TextView timestamp;
    TextView desc;
  }

  ;
}


그 다음에는 ListView나 GridView를 배치해놓고 setAdapter() 메소드를 이용해서 위의 Adapter를 세팅해주면 됩니다.