'category'에 해당되는 글 96건
- 2014.02.09 :: 리눅스] Cent OS 에서 SSH설치 및 파일 전송하기
- 2014.02.04 :: MAC] 맥에서 adb shell 설정하기 3
- 2014.02.04 :: 안드로이드 TIP] 터미널에서 Logcat 보기
- 2014.02.04 :: 리눅스] Cent OS 에서 SVN 세팅하기
- 2013.12.23 :: 안드로이드 TIP] APK 생성 시에 Lint Warnings 발생하는 문제 해결 방법
- 2013.09.11 :: Web 이론 필기노트] 내가 들어 이해한 웹 서버 개념
- 2013.09.10 :: 안드로이드 TIP] Activity가 아닌 곳에서 Intent 하기 4
- 2013.08.22 :: 안드로이드] Fragment 쉽게 사용하기 15
- 2013.08.19 :: 안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 49
- 2013.08.12 :: 간결한 To do List 앱 Todotodo 1
1. ssh 설치
'CentOS' 카테고리의 다른 글
리눅스] Cent OS 에서 SVN 세팅하기 (0) | 2014.02.04 |
---|
open
-e ~/.bash_profile 명령어를 사용하여 bash_profile 파일을 연다
export
PATH=${PATH}:
/Users/username/eclipse/adt-bundle-mac-x86_64-20131030/sdk/platform-tools'Android > Android TIP' 카테고리의 다른 글
Android TIP] UnsupportedOperationException 습관 (0) | 2014.07.15 |
---|---|
Android TIP] strings.xml 에서 특수문자 사용하기 (1) | 2014.02.20 |
안드로이드 TIP] 안드로이드 데이터베이스 파일 PC로 가져오기 (0) | 2014.02.09 |
안드로이드 TIP] APK 생성 시에 Lint Warnings 발생하는 문제 해결 방법 (0) | 2013.12.23 |
안드로이드 TIP] Activity가 아닌 곳에서 Intent 하기 (4) | 2013.09.10 |
svn mkdir svn://localhost/Projects/branches
svn mkdir svn://localhost/Projects/tags
12. svn체크아웃
svn checkout svn://localhost/Projects
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
svn 종료
killall svnserve
종료 확인
ps -ef | grep svn
// kill -9 xxxx 로 가능
'CentOS' 카테고리의 다른 글
리눅스] Cent OS 에서 SSH설치 및 파일 전송하기 (0) | 2014.02.09 |
---|
안드로이드 프로젝트를 APK로 뽑으려는 순간 아래와 같은 오류가 발생 할 때가 있습니다.
안드로이드 16 버전부터 나온 기능인데 프로젝트 내에 레이아웃, 문자열 등을 검사하여 문제가 발생 할 만한 곳을
미리 경고메시지로 알려주는 기능입니다.
예를 들어 en, ko 스트링 폴더를 나눠놨는데 en에는 있는 리소스가 ko에는 없다던가 식의 알림입니다.
이 경고가 뜨면 컴파일 조차 안되는데 아래는 해결 방법입니다.
ADT Preferences > Android > Lint Error Checking > Correntness:Messages > MissingTranslation 선택 후
Severity 를 Warning 으로 바꾸면 됩니다.
'Android > Android TIP' 카테고리의 다른 글
Android TIP] UnsupportedOperationException 습관 (0) | 2014.07.15 |
---|---|
Android TIP] strings.xml 에서 특수문자 사용하기 (1) | 2014.02.20 |
안드로이드 TIP] 안드로이드 데이터베이스 파일 PC로 가져오기 (0) | 2014.02.09 |
안드로이드 TIP] 터미널에서 Logcat 보기 (0) | 2014.02.04 |
안드로이드 TIP] Activity가 아닌 곳에서 Intent 하기 (4) | 2013.09.10 |
예전 부터 해보고 싶던 웹 서버 쪽 개념입니다.
말로 들은 것을 정리한 것이라 잘못 된 내용이 있다면 코멘트 부탁드립니다.
Activity가 아닌 곳 ,
Service , BroadcastReceiver , baseAdapter 등에서 Intent로 새로운 Activity를 열려고 하면
E/AndroidRuntime(27318): android.util.AndroidRuntimeException:
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
Is this really what you want?
라는 런타임 에러가 나옵니다.
안드로이드에서 간단한 toast를 띄울 때 '어디다 띄울거냐' 를 판별하는 this 또는 클래스명.this 와 같이
어느 Task에 Activity를 띄울건지 모르겠다는 에러입니다.
Task는 Activity를 관리하는 것으로 Activity를 띄우려면 해당 Task에 띄워야 하는데
Service , BroadcastReceiver , baseAdapter 등 은 Activity가 아니므로 새로운 Activity를 띄우려면
에러에서의 설명과 같이
Intent intent = new Intent(mContext, BlackBoxVideoPlayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
Intent에 속성을 넣어 새로운 Task를 만들겠다고 해야합니다.
'Android > Android TIP' 카테고리의 다른 글
Android TIP] UnsupportedOperationException 습관 (0) | 2014.07.15 |
---|---|
Android TIP] strings.xml 에서 특수문자 사용하기 (1) | 2014.02.20 |
안드로이드 TIP] 안드로이드 데이터베이스 파일 PC로 가져오기 (0) | 2014.02.09 |
안드로이드 TIP] 터미널에서 Logcat 보기 (0) | 2014.02.04 |
안드로이드 TIP] APK 생성 시에 Lint Warnings 발생하는 문제 해결 방법 (0) | 2013.12.23 |
한 화면을 여러 공간으로 쪼개어 사용하거나 액티비티 이동없이 화면 내부구성을 다른 레이아웃으로
교체 시킬 때 등 Fragment는 여러 군데에서 사용되어지고 있습니다.
Fragment 란 ? : http://androidhuman.tistory.com/469
Fragment를 사용하려면 그것을 사용하는 상위 activity가 FragmentActivity 여야 합니다.
Fragment 생명주기는 activity와 흡사하며 주의 할 점이 activity에서 this로 쓰던 부분을 getActivity()로
바꿔 써주셔야 합니다.
큰 구성은 FragmentActivity를 상속받은 MainActivity.java 가 있고 Fragment 를 상속받은
OneFragment, TwoFragment, ThreeFragment.java 세가지 클래스를 만든다음
activity_main.xml에 있는 ll_fragment 영역에 위에만든 세가지 fragment 를 삽입하는 방식입니다.
먼저 MainActivity 구성입니다.
위 그림과 같이 activity_main.xml 레이아웃 하나에 fragment 가 교체 될 영역과 그 영역을 컨트롤 할
메뉴 뷰 를 만들어 줍니다.
<MainActivity>
public class MainActivity extends FragmentActivity implements OnClickListener {
final String TAG = "MainActivity";
int mCurrentFragmentIndex;
public final static int FRAGMENT_ONE = 0;
public final static int FRAGMENT_TWO = 1;
public final static int FRAGMENT_THREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
bt_oneFragment.setOnClickListener(this);
Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
bt_twoFragment.setOnClickListener(this);
Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
bt_threeFragment.setOnClickListener(this);
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
}
public void fragmentReplace(int reqNewFragmentIndex) {
Fragment newFragment = null;
Log.d(TAG, "fragmentReplace " + reqNewFragmentIndex);
newFragment = getFragment(reqNewFragmentIndex);
// replace fragment
final FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.ll_fragment, newFragment);
// Commit the transaction
transaction.commit();
}
private Fragment getFragment(int idx) {
Fragment newFragment = null;
switch (idx) {
case FRAGMENT_ONE:
newFragment = new OneFragment();
break;
case FRAGMENT_TWO:
newFragment = new TwoFragment();
break;
case FRAGMENT_THREE:
newFragment = new ThreeFragment();
break;
default:
Log.d(TAG, "Unhandle case");
break;
}
return newFragment;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_oneFragment:
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_twoFragment:
mCurrentFragmentIndex = FRAGMENT_TWO;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_threeFragment:
mCurrentFragmentIndex = FRAGMENT_THREE;
fragmentReplace(mCurrentFragmentIndex);
break;
}
}
}
전체적으로 보면 fragment 마다 int으로된 구분자를 주고 메뉴 버튼이 클릭 될 때마다 해당 fragment의
index를 mCurrentFragmentIndex 라는 int 형 변수에 담아 fragment 교체 매소드를 태우는 식입니다.
onCreate부터 보면 메뉴 버튼등록과 리스너를 달고 mCurrentFragmentIndex에 첫 화면 fragment인
FRAGMENT_ONE 를 넣어주고 fragmentReplace 매소드를 타게됩니다.
fragmentReplace 매소드에는 넘겨받은 fragment index를 가지고 getFragment 매소드를 가서
실질적인 fragment의 객체 생성을 하고 그 객체를 리턴해줍니다.
다시 fragmentReplace매소드로 돌아와 리턴받은 fragment로 ll_fragment 라는 레이아웃 영역에
교체를 하게 됩니다. 다른 버튼을 눌렀을 때도 이와 같은 방식으로 동작하게 됩니다.
Fragment 들은
public class OneFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.onefragment, container, false);
Button button = (Button) v.findViewById(R.id.bt_ok);
button.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_ok:
Toast.makeText(getActivity(), "OneFragment", Toast.LENGTH_SHORT)
.show();
break;
}
}
}
이처럼 Activity와 비슷한 구조이고
마지막으로 activity_main.xml 구조입니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:background="#ffffffff"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_oneFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
<Button
android:id="@+id/bt_twoFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2" />
<Button
android:id="@+id/bt_threeFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="3" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
ll_fragment 라는 영역이 Fragment들이 교체 될 영역입니다.
'Android' 카테고리의 다른 글
Android] 안드로이드에서 FTP 서버에 파일 업로드하기 (0) | 2014.02.16 |
---|---|
안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 (49) | 2013.08.19 |
안드로이드] 쉬운 log 관리 (0) | 2013.07.26 |
안드로이드] Custom ArrayAdapter의 기본 틀 (0) | 2013.07.25 |
안드로이드] SharedPreferences 깔끔하게 사용하기 (9) | 2013.07.09 |
페이스북 앱을 보면 좌측 메뉴 버튼을 눌렀을 때 좌측에서 슬라이드로 메뉴가 나오게 됩니다.
원리는 메인화면을 구성하는 xml에 전체를 FrameLayout으로 감싸고 내부에 메뉴 레이아웃을 깔고
그 위에 메인 화면의 레이아웃을 포개어 놓습니다. 그러고 메인화면의 메뉴 버튼을 눌렀을 때 메인화면 레이아웃을
애니메이션 처리하여 우측으로 밀어버려 아래에있던 메뉴 레이아웃이 노출되는 식입니다.
<activity_main.xml>
구성요소는 다음과 같습니다.
1. MainActivity.java
2. OpenAnimation.java
3. CloseAnimation.java
4. activity_main.xml
5. leftslidemenu.xml
먼저 MainActivity 입니다.
public class MainActivity extends Activity implements OnClickListener {
// slide menu
private DisplayMetrics metrics;
private LinearLayout ll_mainLayout;
private LinearLayout ll_menuLayout;
private FrameLayout.LayoutParams leftMenuLayoutPrams;
private int leftMenuWidth;
private static boolean isLeftExpanded;
private Button bt_left, btn1, btn2, btn3, btn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSildeMenu();
}
private void initSildeMenu() {
// init left menu width
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
leftMenuWidth = (int) ((metrics.widthPixels) * 0.75);
// init main view
ll_mainLayout = (LinearLayout) findViewById(R.id.ll_mainlayout);
// init left menu
ll_menuLayout = (LinearLayout) findViewById(R.id.ll_menuLayout);
leftMenuLayoutPrams = (FrameLayout.LayoutParams) ll_menuLayout
.getLayoutParams();
leftMenuLayoutPrams.width = leftMenuWidth;
ll_menuLayout.setLayoutParams(leftMenuLayoutPrams);
// init ui
bt_left = (Button) findViewById(R.id.bt_left);
bt_left.setOnClickListener(this);
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn4 = (Button) findViewById(R.id.btn4);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
}
/**
* left menu toggle
*/
private void menuLeftSlideAnimationToggle() {
if (!isLeftExpanded) {
isLeftExpanded = true;
// Expand
new OpenAnimation(ll_mainLayout, leftMenuWidth,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.75f, 0, 0.0f, 0, 0.0f);
// enable all of menu view
FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)
.getParent();
enableDisableViewGroup(viewGroup, true);
// enable empty view
((LinearLayout) findViewById(R.id.ll_empty))
.setVisibility(View.VISIBLE);
findViewById(R.id.ll_empty).setEnabled(true);
findViewById(R.id.ll_empty).setOnTouchListener(
new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
menuLeftSlideAnimationToggle();
return true;
}
});
} else {
isLeftExpanded = false;
// Collapse
new CloseAnimation(ll_mainLayout, leftMenuWidth,
TranslateAnimation.RELATIVE_TO_SELF, 0.75f,
TranslateAnimation.RELATIVE_TO_SELF, 0.0f, 0, 0.0f, 0, 0.0f);
// enable all of menu view
FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)
.getParent();
enableDisableViewGroup(viewGroup, false);
// disable empty view
((LinearLayout) findViewById(R.id.ll_empty))
.setVisibility(View.GONE);
findViewById(R.id.ll_empty).setEnabled(false);
}
}
public static void enableDisableViewGroup(ViewGroup viewGroup,
boolean enabled) {
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
View view = viewGroup.getChildAt(i);
view.setEnabled(enabled);
if (view instanceof ViewGroup) {
enableDisableViewGroup((ViewGroup) view, enabled);
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_left:
menuLeftSlideAnimationToggle();
break;
case R.id.btn1:
Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT)
.show();
break;
case R.id.btn2:
Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT)
.show();
break;
case R.id.btn3:
Toast.makeText(getApplicationContext(), "3", Toast.LENGTH_SHORT)
.show();
break;
case R.id.btn4:
Toast.makeText(getApplicationContext(), "4", Toast.LENGTH_SHORT)
.show();
break;
}
}
}
최초에 initSildeMenu()매소드에서 사용 할 메인 레이아웃과 메뉴 레이아웃을 초기화 합니다.
메뉴 레이아웃은 열렸을 때 화면 전체너비로 열리는 것이 아니라 우측에 메인 레이아웃이 살짝 걸치므로
메뉴 레아이웃 너비가 될 leftMenuWidth 변수에 화면전체 너비에 0.75 정도 비율을 넣어 줍니다.
이 후에 메인 레이아웃을 findViewById 하고 메뉴 레이아웃도 findViewById 한 후
아까 만든 0.75의 너비를 width로 넣어줍니다. 나머지 버튼들도 리스너를 달아줍니다.
이제 핵심이 되는 menuLeftSlideAnimationToggle() 매소드 입니다
토글이라는 말과 같이 메뉴가 열고 닫힐 때 모두 이 매소드를 사용하며
isLeftExpanded라는 boolean 값으로 열고 닫힐 때를 판단하게 됩니다.
우선 열릴 때 입니다.
메뉴버튼을 눌러 메뉴가 열리게 되면 우선 isLeftExpanded = true; 를 줘서 메뉴가 열렸다를 저장하고
OpenAnimation 이란 클래스를 통하여 메뉴가 열리게 됩니다.
처음 구조 설명 할 때 설명을 안했지만 메인 레이아웃 위에 empty 레이아웃을 하나 더 포개었는데
이 뷰를 VISIBLE 시키게 됩니다. 이 ll_empty 뷰는 투명한 뷰이며
메뉴가 열려있을 때 우측에 살짝 보이는 메인 레이아웃을 덮고 있습니다.
이 뷰를 터치하면 menuLeftSlideAnimationToggle(); 매소드를 호출하여 메뉴가 닫히게 됩니다.
이는 꼭 메뉴버튼을 눌러야 메뉴가 닫히는것이 아닌 그냥 메인 뷰만 터치하면 닫히도록하는 편리함을 위함입니다.
public class OpenAnimation extends TranslateAnimation implements
Animation.AnimationListener {
private LinearLayout mainLayout
int panelWidth;
public OpenAnimation(LinearLayout layout, int width, int fromXType,
float fromXValue, int toXType, float toXValue, int fromYType,
float fromYValue, int toYType, float toYValue) {
super(fromXType, fromXValue, toXType, toXValue, fromYType, fromYValue,
toYType, toYValue);
// init
mainLayout = layout;
panelWidth = width;
setDuration(250);
setFillAfter(false);
setInterpolator(new AccelerateDecelerateInterpolator());
setAnimationListener(this);
mainLayout.startAnimation(this);
}
public void onAnimationEnd(Animation arg0) {
LayoutParams params = (LayoutParams) mainLayout.getLayoutParams();
params.leftMargin = panelWidth;
params.gravity = Gravity.LEFT;
mainLayout.clearAnimation();
mainLayout.setLayoutParams(params);
mainLayout.requestLayout();
}
public void onAnimationRepeat(Animation arg0) {
}
public void onAnimationStart(Animation arg0) {
}
}
OpenAnimation 클래스입니다. 받아온 속성들로 초기화를 하며 setDuration(250);이 부분이 열릴 때의 속도입니다.
메뉴가 닫힐 때는 isLeftExpanded로 닫힐 때를 가려내고 isLeftExpanded = flase;를 줘 닫힘을 저장합니다.
OpenAnimarion 클래스와 같이 CloseAnimation을 호출하게되고 활성화 되어있던 empty뷰를 꺼서
메인 레이아웃이 다시 노출되게 합니다.
public class CloseAnimation extends TranslateAnimation implements
TranslateAnimation.AnimationListener {
private LinearLayout mainLayout;
int panelWidth;
public CloseAnimation(LinearLayout layout, int width, int fromXType,
float fromXValue, int toXType, float toXValue, int fromYType,
float fromYValue, int toYType, float toYValue) {
super(fromXType, fromXValue, toXType, toXValue, fromYType, fromYValue,
toYType, toYValue);
// Initialize
mainLayout = layout;
panelWidth = width;
setDuration(250);
setFillAfter(false);
setInterpolator(new AccelerateDecelerateInterpolator());
setAnimationListener(this);
// Clear left and right margins
LayoutParams params = (LayoutParams) mainLayout.getLayoutParams();
params.rightMargin = 0;
params.leftMargin = 0;
mainLayout.setLayoutParams(params);
mainLayout.requestLayout();
mainLayout.startAnimation(this);
}
public void onAnimationEnd(Animation animation) {
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}
}
CloseAnimation입니다.
아래엔 사용한 xml 파일입니다.
<-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_menuLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff393c46"
android:gravity="left"
android:orientation="vertical"
android:textColor="#ff000000" >
<!-- include -->
<include
android:id="@+id/ic_leftslidemenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/leftslidemenu" />
</LinearLayout>
<!-- slide layout -->
<LinearLayout
android:id="@+id/ll_mainlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:gravity="left"
android:orientation="vertical" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/bt_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="Left Slide" />
<LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</LinearLayout>
<LinearLayout
android:id="@+id/ll_empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent" />
</FrameLayout>
</LinearLayout>
</FrameLayout>
</LinearLayout>
<-- leftslidemenu.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#994444cc"
android:orientation="vertical"
android:padding="10dp" >
<Button
android:id="@+id/btn1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 1 " />
<Button
android:id="@+id/btn2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 2 " />
<Button
android:id="@+id/btn3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 3 " />
<Button
android:id="@+id/btn4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button 4 " />
</LinearLayout>
위 처럼 메인 레이아웃에 메뉴 레이아웃이 include 되어있습니다.
-- 2013 10 04 내용추가
현재 버전에는 메인 화면에서는 메인 화면이 덮고있는 중에도 터치를 하면 뒤 LeftMenu의 버튼이 눌리게 됩니다.
초보개발자 님 말씀대로 visible방법도 가능하고
저는 뷰를 닫을 때 LeftMenu에 있는 모든 뷰를 다 setEnable로 꺼버리고
열 때는 켜는 식을 사용 했습니다.
열고 닫을 때
FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)
.getParent();
이런식으로 menu 레이아웃을 잡고
enableDisableViewGroup(viewGroup, false);
setEnable을 true 할 건지 false 할 건지 정해 주시면 됩니다.
그럼
public
static
void
enableDisableViewGroup(ViewGroup viewGroup,
boolean
enabled) {
int
childCount = viewGroup.getChildCount();
for
(
int
i =
0
; i < childCount; i++) {
View view = viewGroup.getChildAt(i);
view.setEnabled(enabled);
if
(view
instanceof
ViewGroup) {
enableDisableViewGroup((ViewGroup) view, enabled);
}
}
}
FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_fragment)
.getParent();
이렇게 좌측 슬라이드 메뉴 레이아웃을 잡고
enableDisableViewGroup 매소드 for문 안쪽에
View view = viewGroup.getChildAt(i);
if (view.getId() != R.id.ib_left) {
view.setEnabled(enabled);
if (view instanceof ViewGroup) {
enableDisableViewGroup((ViewGroup) view, enabled);
}
}
이런식으로 LeftSlide 버튼만 살려서 disable을 막는 방법이 있습니다.
-- 2013 10 22 내용추가
좌 우 측 슬라이드가 모두 되는 소스 첨부 합니다.
우측 슬라이드도 좌측 슬라이드와 같은 방식으로 만들었습니다.
'Android' 카테고리의 다른 글
Android] 안드로이드에서 FTP 서버에 파일 업로드하기 (0) | 2014.02.16 |
---|---|
안드로이드] Fragment 쉽게 사용하기 (15) | 2013.08.22 |
안드로이드] 쉬운 log 관리 (0) | 2013.07.26 |
안드로이드] Custom ArrayAdapter의 기본 틀 (0) | 2013.07.25 |
안드로이드] SharedPreferences 깔끔하게 사용하기 (9) | 2013.07.09 |
딱 todolist 기능만 있는 앱을 만들었습니다.
UX 부분에서 좀 더 빨리 좀 더 심플하게 할 일을 추가하고 체크하는 쪽으로 생각을 하였습니다.
메인화면에 바로 할 일을 적을 수 있고 체크, 체크해재 등이 가능합니다.
설정에서 체크 시 삭제를 설정하면 메인화면에서 체크 시 바로 목록에서 삭제되며
총 할 일 갯수와 한 일 갯수를 계산하여 진행도를 상단에 표시하였습니다.
안드로이드 버전만 배포하였습니다.
play store : https://play.google.com/store/apps/details?id=com.song.todotodo