Android – ActionBar Title Center 정렬하기

ActionBar Title을 Center에 또는 다르게 정렬하고 싶을 때 아래와 같이 할 수 있다.


ref

ActionBar에 들어갈 레이아웃을 생성하자.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="my Title"
        android:textColor="#ffffff"
        android:id="@+id/mytext"
        android:textSize="18sp" />

</LinearLayout>

ActivityonCreate부분에서 아래와 같이 넣어주자.

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
getSupportActionBar().setCustomView(R.layout.abs_layout);

이제 다른 타이틀 필드를 가진 ActionBar를 가졌다. 이를 사용하기 위해서 아래와 같이 입력해주자.

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.yourimage));

Android – 버튼 가로 사이즈에 같게 세로 사이즈 설정하기

막상 설정하고 보니 그렇게 아름답지 않을 수 있다는 생각이 든다. 해상도가 큰 화면에서 (타블렛) 버튼의 크기가 가로가 기준이 되다보니 세로도 같은 사이즈로 늘어나면 예상한건데 반화면 이상을 스크롤 해야 될 것이다.

아… 그래서 생각이 된것인데 이럴 경우 버튼 3개 3/3 으로 표시되도록 하는 것도 나쁘지 않을 거 같다는 생각이 든다.

여기 2가지 방법이 있다.

첫 번째 방법은 해당 버튼의 가로 사이즈를 가져와 그대로 설정하는 부분이고.

Button yourBtn = (Button) findViewById.(R.id.yourBtn);
int btnSize=yourBtn.getLayoutParams().width;
yourBtn.setLayoutParams(new LayoutParams(btnSize, btnSize));

만약 화면 해상도에 따라 수치를 적용한다면, 화면 사이즈를 가져와 나누어 사용하는 방법이 있겠다.

Android – DialogFragment안에 Fragment를 사용할려면…

문제는 이렇다.
Fragment 안에 Fragment가 일부분 들어가지 못한다. 코딩을 할 때는 표준을 지켜야 되며, 여기서 표준이란 여기도 돌아가고 저기도 돌아가는 것을 의미한다.

  1. Fragment안에 Fragment는 getChildFragmentManager()메서드를 이용하여야 한다.

  2. 아래와 같은 오류가 발생되었을 때

IllegalStateException: Fragment does not have a view

ref
DialogFragment Source

커스텀 다이얼로그를 만들 때 onreateDialog(..)를 사용하면 DialogFragment는 null View를 가지게 됩니다. (메시지가 그렇게 뜨지요) 일반적으로 다이얼 로그 안에 뷰가 필요하지는 않지요. AlertDialog.builder와 소통하는 건 완벽한 방법이라고 생각되지는 않지만 아래와 같은 방법을 고려할 수 있습니다.

  1. onCreateDialog 대신 onCreateView를 오버라이딩하여 사용
  2. Fragment로부터 상속 받은 나만의 타입으로 생성하기
  3. FragmentPagerAdpater가 아닌 PagerAdapter 사용하기.

  4. 부가적으로 dialog 배경 투명하기 만들기
    ref

  Dialog dialog = new Dialog(getActivity());

    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);      

        // layout to display
    dialog.setContentView(R.layout.add_edit);

    // set color transpartent
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show();

Android – 커스텀 PreferenceActivity

PreferenceCategory 및 설정 화면을 커스텀 하기 위한 방법을 소개합니다.


일단 두 가지 방법으로 커스터마이징을 할 수 있습니다.

  • XML Style로 커스터마이징하기 (설명 없음)
  • XML Layout을 작성하여 커스터마이징하기
  • Code base 상속을 이용하여 커스터마이징하기
    ref

  • XML Layout을 이용하여 커스터마이징하기.

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project Licensed under the 
Apache License, Version 2.0 (the "License"); you may not use this file except 
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 
Unless required by applicable law or agreed to in writing, software distributed 
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES 
OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
the specific language governing permissions and limitations under the License. -->

<!-- Layout for a Preference in a PreferenceActivity. The Preference is able 
to place a specific widget for its particular type in the "widget_frame" 
layout. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent" android:layout_height="wrap_content"
              android:minHeight="?android:attr/listPreferredItemHeight"
              android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize">

    <RelativeLayout android:layout_width="wrap_content"
                    android:layout_height="wrap_content" android:layout_marginLeft="15dip"
                    android:layout_marginRight="6dip" android:layout_marginTop="6dip"
                    android:layout_marginBottom="6dip" android:layout_weight="1">

        <TextView android:id="@+android:id/title"
                  android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:singleLine="true" android:textAppearance="?android:attr/textAppearanceLarge"
                  android:ellipsize="marquee" android:fadingEdge="horizontal"
                  android:textColor="#666666" />

        <TextView android:id="@+android:id/summary"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_below="@android:id/title"
                  android:layout_alignLeft="@android:id/title"
                  android:textAppearance="?android:attr/textAppearanceSmall"
                  android:textColor="#666666"
                  android:maxLines="4" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout android:id="@+android:id/widget_frame"
                  android:layout_width="wrap_content" android:layout_height="match_parent"
                  android:gravity="center_vertical" android:orientation="vertical" />

</LinearLayout>

위와 같이 생성한 layout으로 preference_checkbox.xml을 작성하여 아래와 같이 사용할 수 있다.

    <PreferenceCategory
        android:title="카테고리 제목">
        <CheckBoxPreference
            android:key="share"
            android:title="공유하기"
            android:summary="정보를 공유한다"
            android:defaultValue="true"
            android:layout="@layout/preference_checkbox
            />
  • Code base 상속을 이용하여 커스터마이징하기
/**
 * Created by hojunbaek on 9/5/14.
 */
public class EZCheckBoxPreference extends CheckBoxPreference {
    public EZCheckBoxPreference(Context context) {
        super(context);
    }

    public EZCheckBoxPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EZCheckBoxPreference(Context context, AttributeSet attrs,
                                int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        TextView titleTv = (TextView) view.findViewById(android.R.id.title);
        titleTv.setTextColor(getContext().getResources().getColor(R.color.text_color));
    }
}

위와 같이 상속을 이용하여 아래와 같이 사용할 수 있다.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <com.ezcocoa.EZPreferenceCategory
        android:title="카테고리 제목">
        <com.cocoaEZCheckBoxPreference
            android:key="share"
            android:title="공유하기"
            android:summary="정보를 공유한다"
            android:defaultValue="true"
            />

끝!

Android – Android Studio에서 JNI 사용하기

JNI를 사용하기 위해 https://gist.github.com/khernyo/4226923 위에 거론된 방법을 사용하였지만
Gradle plugin 0.4.0+부터 동작이 정상적으로 되지 않아 구글링 하여 아래와 같은 방법을 찾아 냈다.

링크

예로

proejct
|--libs
     |--armeabi/xxx.so
     |--xxx.jar

와 같은 구조로 되어있다면 아래와 같은 방법으로 처리할 수 있다.
일단 so파일은 lib 폴더에 위치해야 한다. 아래와 같은 구조로 생성 후 zip파일을 압축한다.

lib/armeabi/xxx.so

다음에 zip확장자를 jar파일로 변경하여 컴파일 하고 끝!

Android – Google Play 앱 리뷰 내려 받기

어플리케이션 리뷰들을 내려 받을려면 어떻게 해야할까?


구글은 리뷰를 내려받기 위해 gsutil을 제공한다. 이 유틸은 Python으로 제작되어 있으며, Google Cloud Storage에 접속하기 위한 Command line툴이다.

어떠한 것들을 할 수 있을까?

a wide range of bucket and object management tasks, including:

  • Creating and deleting buckets.
  • Uploading, downloading, and deleting objects.
  • Listing buckets and objects.
  • Moving, copying, and renaming objects.
  • Editing object and bucket ACLs.

그럼 설치를 해보자.

설치 가이드 링크

  1. 다운로드

    gsutil.tar.gz

  2. 압축 해제

tar xfz gsutil.tar.gz -C $HOME
  1. Path 추가
# emacs ~./bashrc
 export PATH=${PATH}:$HOME/gsutil
 
  1. 터미날을 재시작하거나 source툴을 이용하여 설정파일을 다시 읽어오자.

  2. Option으로 gsutil update 의 명령으로 업데이트 해주자.

모든 설치가 완료되었다.

데이터에 접근하기 위해서는 gsutil에 대한 설정이 필요하다. 이부분은 Google Cloud 접속에 대한 부분이다.

  1. 접속 코드를 발급 받기 위해 아래의 명령을 입력하자.
# gsutil config

입력과 동시에 하나의 URL이 발급되며, 해당 URL로 접속하면 접속 코드가 발급된다.
발급되어진 코드를 커맨드 라인에 입력을 하자. 이후 Project-id 입력란이 뜨고 Google Cloud Storage사이트에 접속하여 project-id을 알아내어 커맨드라인에 입력하자.

모든 준비가 완료되었다.
아래의 사이트를 참조하여 리뷰정보들을 가져올 수 있다.

** 리뷰 가져오기 **

# gsutil cp -r gs://pubsite_prod_rev_123412341234/reviews/reviews_com.example.app_2014* .

링크

Android – ListView에 Header/Footer를 추가하면?

  • 거지 같은 내 인생.. 잠시 한탄해본다. (사실은 전혀 그렇지 않다. 잠시 짜증이 났을 뿐. 누구나 가끔씩 지르고 싶을때가 있는 것처럼…)

원문

질문 왜 ListView에 Header View을 추가하면 인덱스가 0이 아니라 1이 될까?

이유는 onItemClick에서는 Header와 Footer를 아이템으로 보기 때문이다. (어댑터가 아닌 이유에…)

그렇다면 어떻게 이 문제를 해결 할 수 있을까? 간단하게 아래와 같이 해결할 수 있다.


adapter.getItem(position);

위와 같이 사용하였다면 아래와 같이 사용해주자.

listView.getItemAtPosition(position);

끝.

안드로이드 > addJavascriptInterface() 가 동작하지 않는다면?

문제의 원인

만약 targetSdkVersion 17이거나 더 높다면 꼭 메서드 위에 @JavascriptInterface 주석을 달아주어야 하며 불리우는 메서드 접근자는 Public으로 처리되어야 한다. 만약 처리가 되지 않았다면 접근을 하지 못하여 불리지 않게 된다.


ex)

 @JavascriptInterface
 public void getSource(String s) {....

위의 코드를 넣어줌으로 써 접근이 가능해진다.

이상