14 Nov 2016
|
Windows
Windows 10 - 설치할 프로그램들
개인적으로 구매해서 사용하는 프로그램들이나 실생활 또는 개발시 유용하게 사용하는 프로그램들입니다.
13 Nov 2016
|
Windows
Windows 10 - 설치 후 초반 세팅
Windows 10 초기화를 수십차례 했음에도 자꾸 잊어버리는 작업들이 있어서 메모 차원에서 간단히 정리해보았습니다. 어디까지나 제 개인적인 취향이나 설정에 치우친 글입니다.
윈도우 & 드라이버 업데이트
가장 필수적이며, 최우선으로 하도록 합시다.
에서 설정 및 최신 드라이버로 업데이트할 수 있습니다.
키보드 재입력 시간 조절
개인적으로 키보드 재입력 시간에 딜레이가 있으면 너무 답답해서 키보드 재입력 시간을 최소화 해주고 있습니다.
에서 설정할 수 있습니다.
OneDrive 사용 Off
한 때 OneDrive를 많이 사용했었는데, 너무 느리기도 하고 동기화로 인한 LTE 데이터 소진 등을 막기 위해서 요즘은 아예 끄고 다닙니다.


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

스토어 앱 추천 Off

만약 최근에 사용한 항목의 이력을 지우고 싶으시면 아래쪽에 있는 ‘시작 메뉴의 점프 목록 또는 작업 표시줄에 최근에 사용한 항목 표시’ 항목도 체크를 없애시면 됩니다.
14 Oct 2016
|
Android
UX
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를 세팅해주면 됩니다.
12 Oct 2016
|
Android
ADB
각 화면 밀도에서의 dp와 px간 비율
각 화면 밀도에서 dp
와 px
간의 환산표입니다. 하지만, 모든 단말에 대해 100% 일치하지는 않습니다. 단말에 따라 같은 밀도라도 비율이 조금 다른 경우도 있으니 주의해야 합니다.
밀도 |
dp |
px |
ldpi |
1dp |
0.75 px |
mdpi |
1dp |
1 px |
hdpi |
1dp |
1.5 px |
xhdpi |
1dp |
2 px |
xxhdpi |
1dp |
3 px |
xxxhdpi |
1dp |
4 px |
10 Oct 2016
|
Android
Activity간 사용자 정의 클래스 데이터를 전달하는 예제 코드입니다.
Activity간 데이터를 이동시킬 때는 그 데이터를 Serializable(또는 Parcelable) 해주어야
데이터가 전달됩니다.
데이터를 Serializable 화 하는 건 다음과 같이 Serializable 인터페이스를 구현해주는
것으로 충분합니다.
MyObject.java
class MyObject implements Serializable {
int nID;
String strName;
MyObject(int _id, String _Name) {
nID = _id;
strName = _Name;
}
};
Activity 코드들은 각각 다음과 같습니다.
firstActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class firstActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTest = (Button) findViewById(R.id.btnLaunch2ndActivity);
btnTest.setOnClickListener(myButtonClick);
}
Button.OnClickListener myButtonClick = new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(firstActivity.this, secondActivity.class);
MyObject obj = new MyObject(314, "SnowDeer");
intent.putExtra("StringData_1", "첫번째 String 데이터");
intent.putExtra("StringData_2", "두번째 String 데이터");
intent.putExtra("ObjectData", obj);
startActivity(intent);
}
};
}
secondActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class secondActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_2);
TextView tvView = (TextView) findViewById(R.id.tvTextView);
Intent intent = getIntent();
if(intent != null) {
String strText = "";
MyObject obj;
obj = (MyObject) intent.getSerializableExtra("ObjectData");
strText = "StringData_1 : " + intent.getStringExtra("StringData_1") + "\n" +
"StringData_2 : " + intent.getStringExtra("StringData_2") + "\n" +
"MyObject.ID : " + obj.nID + "\n" +
"MyObject.Name : " + obj.strName;
tvView.setText(strText);
}
}
Button.OnClickListener myButtonClick = new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(secondActivity.this, firstActivity.class);
startActivity(intent);
}
};
}