*요약 

- 이제 findViewById()를 쓸 필요가 없다


기존에는 xml에 id를 선언하고 해당 ui를 컨트롤 하기 위해서는 클래스에 findViewById()를 무조건 해줬습니다.

다음과 같이 말이죠


activity_main.xml

<android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:id="@+id/tv_ShowText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/btn_GetData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getDataButton" />

</android.support.constraint.ConstraintLayout>

MainActivity.java

private TextView mShowText = null;
private Button mGetBtn = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShowText = (TextView) findViewById(R.id.tv_ShowText);
mGetBtn = (Button) findViewById(R.id.btn_GetData);
}

지금은 ui가 Text와 Btn밖에 없기 때문에 findViewById()를 2번만 선언하였습니다.

하지만 앱이 복잡해지고 ui 컴포넌트가 많아질경우 findViewById는 얼마나 많이 선언해줘야 할까요?



다음과 같이 개선된 방식을 사용하면 일일이 findViewById를 선언해 주지 않아도 됩니다.

1. 앱 단위 build.gradle에 dataBinding을 선언해 줍니다.

dataBinding {
enabled = true
}


2.layout xml 최상위 루트에 <layout> 태그를 넣어 줍니다.

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

<android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:id="@+id/tv_ShowText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/btn_GetData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getDataButton" />

</android.support.constraint.ConstraintLayout>
</layout>


3.클래스에서는 setContentView(R.layout.activity_main);-> DataBindingUtil.setContentView(this, R.layout.activity_main); 같이 변경해준다.

private ActivityMainBinding mBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.tvShowText.setText("바뀐다");
}

*참고 ActivityMainBinding클래스는 실제로 없습니다. 안드로이드에서 자동적으로 만들어 줍니다.

그래서 ReBuild 하기 전까지 오류로 표시될것입니다.

하지만 따라가야할 규칙이 있습니다. 멤버변수 클래스 네임은 xml파일을 따라갑니다. 

activity_main.xml ->    ActivityMainBinding

activity_content.xml ->    ActivityContentBinding

activity_love.xml ->    ActivityLoveBinding

main_act.xml    ->    MainActBinding

love_act.xml    ->    LoveActBinding


*Fragment에서 사용법

fragment_blank.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">

<FrameLayout xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.damoa.framenttest.BlankFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />

<WebView
android:id="@+id/test_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</FrameLayout>
</layout>

BlankFragment.java

private FragmentBlankBinding mBinding = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_blank, container, false);
mBinding.testWebview.loadUrl("https://www.google.co.kr");

return mBinding.getRoot();
}







728x90
반응형

태블릿을 개발하다보면 새로나오는 태블릿마다 해상도가 깨지는 현상이 발생한다.

DP로 정해줘도 태블릿이 새로나오면 UI가 깨지는 현상이 발생된다.

이유는

1. 해상도가 다르다.

2. DPI가 다르기 때문이다.


아래에 표를 보면 태블릿의 DP해상도는 크게 3개의 크기로 구분 할 수 있을거 같다.

1280 * 800

1024 * 768

960 * 600


*참고1) PX/DPI = DP , DP*DPI = PX

*참고2) smallestWidth(DP)는 가로,세로의 상관없이 가장 적은  비율의 값

*참고 표1 Orientation = LandScape 기준으로 작성

 기종

PX

DPI

  DP

smallestWidth(DP)  

WIDTH 

HEIGHT 

WIDTH 

 HEIGHT

Galaxy Note 10.1 2014 Edition

 2560

1600 

1280 

800 

 800

 Galaxy Note 10.1

 1280

800 

1280 

800 

800 

 Galaxy Tab 10.1

 1280

800 

1280 

800 

800 

 Galaxy Tab  8.9

1280 

800 

1280 

800 

800 

 Galaxy Tab A(2016)

1920 

1200 

1.5 

1280 

800 

800 

 Galaxy Tab S2

2048 

1536 

1024 

768 

768 

 Galaxy Tab A 9.7

1024 

768 

1024 

768 

768 

 Nexus 9 

2048 

1536 

1024 

768 

768 

 Galaxy Tab S3 

 2048

1536 

2.25 

910.2 

682.7 

682.7 

 Galaxy Tab E(W/B)

 1280

800 

1.33

961.5 

600.9 

600.9 

 G Pad3 8.0

 1920

1200 

960 

600 

600 


위에 표를 보았을 때 느낀점은 Galaxy Tab S3는 왜 DPI가 저럴까?;; 필자도 궁금하다.


태블릿마다 해상도가 깨지는 현상이 발생시 수정방법은 여러가지가 있겠지만 그중에 2가지를 들 수 있을거 같다.


방법 1.직접적으로 layout 폴더를 분기 처리한다.

장점

-부분적으로 고치기 딱좋다고 생각된다. UI가 중첩되거나 깨지는 부분만 고치면 되기 때문이다.

단점

-UI가 중첩되거나 깨지는 부분만 고치게 될 경우 UI가 언밸런스 해보일 수 있다.

 

참고 표2

 레이아웃 폴더 분기 종류

 설명

비고 

 layout

 기본레이아웃

 

layout-port

 가로모드시 레이아웃 적용

 

layout-land 

세로모드시 레이아웃 적용 

 

layout-sw600dp 

smallestWidth의 값이 600dp이상일 경우 적용

 1. smallestWidth의 값이 650dp이고 layout-sw600dp, layout-sw651dp폴더가 있을경우 smallestWidth 650dp의 값은 layout-sw600dp에 영향을 받는다.

2. 폴더명 뒤에 -port,-land는 적용 되지 않는다.

 layout-w600dp-port

세로모드의 넓이 dp값이 600이상일 경우 레이아웃 적용

세로모드의 넓이 dp값이 650이고layout-w600dp-port, layout-w651dp-port폴더가 있을경우 650dp의 값은 layout-w600dp-port에 영향을 받는다.

 layout-w600dp-land

가로모드의 넓이 dp값이 600이상일 경우 레이아웃 적용

가로모드의 넓이 dp값이 650이고 layout-w600dp-port, layout-w651dp-port폴더가  있을경우 650dp의 값은 layout-w600dp-port에 영향을 받는다.


방법 2.직접적으로 value폴더의 diman.xml를 분기 처리한다.

장점

-UI를 한꺼번에 고치기 딱 좋다. 깨지는 태블릿의 비율만 계산하여 폴더 분기 처리하면 한꺼번에 적용되기 때문이다.

단점

-비율계산이 잘못될 경우 기존 UI가 망가질수 있다.

참고 표3

-해상도 비율

 해상도

 비율

1280*800 

8:5 

1024*768 

4:3 

960*600 

8:5 









728x90
반응형

안드로이드 앱설치 여부를 확인하기 위해서는 해당앱의 패키지 명을 알고 있어야합니다.


isInstallPackage_2(this,"com.test.pkgname");

/**
* 설치여부를 판단한다
* @param context context
* @param pkgName 패키지명
* @return 설치여부
*/
public static String isInstallPackage_2(Context context, String pkgName){
PackageManager manager = context.getPackageManager();
PackageInfo pi;
try {
pi = manager.getPackageInfo(pkgName, PackageManager.GET_META_DATA);
if(pi!=null){
return pi.versionName+"";
}
} catch (NameNotFoundException e) {
}
return null;
}


728x90
반응형

매니페스트에 다음과 같이 밑줄 된 값이 필요할때 다음과 같이 가져온다.


AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.si.pe.shin.library"
android:versionCode="1"
android:versionName="3.7.0" >

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:description="@string/app_name"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activity.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

/**
* 매니페스트 버전을 얻는다
* @param context context
* @return 버전
*/
public static String getVersionName(Context context) {
String version = "";
try {
PackageInfo i = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
version = i.versionName + "";
} catch(NameNotFoundException e) {
}
return version;
}
/**
* 매니페스트 버전코드를 얻는다
* @param context context
* @return 버전코드
*/
public static int getVersionCode(Context context) {
int versionCode = 1;
try {
PackageInfo i = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
versionCode = i.versionCode;
} catch(NameNotFoundException e) {
}
return versionCode;
}
/**
* 매니페스트 Description를 얻는다
* @param context context
* @return 어플아이디
*/
public static String getDescription(Context context) {
String appId = "";
try {
PackageManager pm = context.getPackageManager();
PackageInfo i = pm.getPackageInfo(context.getPackageName(), 0);
appId = i.applicationInfo.loadDescription(pm) + "";
} catch(NameNotFoundException e) {
}
return appId;
}

/**
* 매니페스트 Label을 얻는다
* @param context context
*/
public static String getAppLabel(Context context) {
String appName = "";
try {
PackageManager pm = context.getPackageManager();
PackageInfo i = pm.getPackageInfo(context.getPackageName(), 0);
appName = i.applicationInfo.loadLabel(pm) + "";
} catch(NameNotFoundException e) {
}
return appName;
}


728x90
반응형

개발을 하다보면 특정앱은 백그라운드에 남기지 말아야할때가 있습니다.


그럴때는 


        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" 

            android:excludeFromRecents="true"

            >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>


밑에 코드를 매니페스트 액티비티에 사용해주시면 앱이 백그라운드에 남아 있지않게 됩니다.

android:excludeFromRecents="true"


밑에 그림을 보시면 현재 저는 Test을 실행시키고 스마트폰 백그라운드를 열었습니다.

이렇게 그림만 보면 모르겠지만 원래는 Test앱이 네이버앱 앞에 표시되어야합니다.

하지만 저는 android:excludeFromRecents="true"해당 코드를 사용하여

앱이 백그라운드에 표시되지 않도록 하였습니다.

728x90
반응형

첫문자를 숫자를 입력할 경우숫자만 입력되고

첫문자를 영어를 입력할 경우 영어만 입력되는 예제


private EditText mEdit;


@Override

protected void onCreateX(Bundle savedInstanceState) {

mEdit = (EditText)findViewById(R.id.test_edit);

mEdit.addTextChangedListener(new TextWatcher() {

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

// TODO Auto-generated method stub

if(count == 0){

mEdit.setFilters(new InputFilter[]{filterAll});

}else if(count == 1){

if(isNumber(s.toString())){

mEdit.setFilters(new InputFilter[]{filterNum});

}else{

mEdit.setFilters(new InputFilter[]{filterEng});

}

}

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

// TODO Auto-generated method stub

}

@Override

public void afterTextChanged(Editable s) {

// TODO Auto-generated method stub

}

});

}

   public static boolean isNumber(String str){

       boolean result = false;

       try{

           Double.parseDouble(str) ;

           result = true ;

       }catch(Exception e){}


       return result ;

   }

    

    private InputFilter filterNum = new InputFilter() {

@Override

public CharSequence filter(CharSequence source, int start, int end,

Spanned dest, int dstart, int dend) {

// TODO Auto-generated method stub

Pattern ps = Pattern.compile("^[0-9]+$");

if(!ps.matcher(source).matches()){

return "";

}

return null;

}

};

    private InputFilter filterEng = new InputFilter() {

@Override

public CharSequence filter(CharSequence source, int start, int end,

Spanned dest, int dstart, int dend) {

// TODO Auto-generated method stub

Pattern ps = Pattern.compile("^[a-zA-Z]+$");

if(!ps.matcher(source).matches()){

return "";

}

return null;

}

};

    private InputFilter filterAll = new InputFilter() {

@Override

public CharSequence filter(CharSequence source, int start, int end,

Spanned dest, int dstart, int dend) {

return source;

}

};




728x90
반응형

안드로이드 타겟버전은 정하지않고 최소버전이 12인 상태에서 Theme.Holo.Light 테마를 쓰는 상태일경우

DatePickerDialog, DatePickerDialog가 앱이 죽는 현상 발생


현재 매니페스트 상태

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testdatepicker"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="12"/>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>


해결방법

날짜

private void showCalendarDialog() {
Context context = null;
DatePickerDialog dialog = null;
Calendar calendar = Calendar.getInstance();

// 안드로이드 7.0버전부터 Theme.Holo.Light를 지원하지 않음
if (Build.VERSION.SDK_INT >= 24) {
context = new ContextThemeWrapper(mContext, android.R.style.Theme_DeviceDefault_Light_Dialog);
}else{
context = mContext;
}

dialog = new DatePickerDialog(context, mDateSetListener, calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
dialog.show();
}


private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub

}

};


시간

private void showTimeDialog() {

Context context = null;
TimePickerDialog dialog = null;
Calendar calendar = Calendar.getInstance();

// 안드로이드 7.0버전부터 Theme.Holo.Light를 지원하지 않음
if (Build.VERSION.SDK_INT >= 24) {
context = new ContextThemeWrapper(mContext, android.R.style.Theme_DeviceDefault_Light_Dialog);
}else{
context = mContext;
}

dialog = new TimePickerDialog(context, mTimeSetListener, calendar.get(Calendar.HOUR_OF_DAY), 0, true);
dialog.show();
}

private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// TODO Auto-generated method stub

}

};



어떤 테마스타일 이쁜지 확인하고 싶을경우

MainActivity.class


import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TimePicker;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener {
private final static boolean isShowDatePickerDialog = true; // DatePickerDialog 노출여부

private Context mContext = null;
private LinearLayout mLinearLayout = null;
private ListView mListView = null;
private int[] mStyleIdArr = {
android.R.style.Theme,
android.R.style.Theme_Black,
android.R.style.Theme_Black_NoTitleBar,
android.R.style.Theme_Black_NoTitleBar_Fullscreen,
android.R.style.Theme_DeviceDefault,
android.R.style.Theme_DeviceDefault_Dialog,
android.R.style.Theme_DeviceDefault_Dialog_MinWidth,
android.R.style.Theme_DeviceDefault_Dialog_NoActionBar,
android.R.style.Theme_DeviceDefault_Dialog_NoActionBar_MinWidth,
android.R.style.Theme_DeviceDefault_DialogWhenLarge,
android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar,
android.R.style.Theme_DeviceDefault_InputMethod,
android.R.style.Theme_DeviceDefault_Light,
android.R.style.Theme_DeviceDefault_Light_DarkActionBar,
android.R.style.Theme_DeviceDefault_Light_Dialog,
android.R.style.Theme_DeviceDefault_Light_Dialog_MinWidth,
android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar,
android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth,
android.R.style.Theme_DeviceDefault_Light_DialogWhenLarge,
android.R.style.Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar,
android.R.style.Theme_DeviceDefault_Light_NoActionBar,
android.R.style.Theme_DeviceDefault_Light_NoActionBar_Fullscreen,
android.R.style.Theme_DeviceDefault_Light_Panel,
android.R.style.Theme_DeviceDefault_NoActionBar,
android.R.style.Theme_DeviceDefault_NoActionBar_Fullscreen,
android.R.style.Theme_DeviceDefault_Panel,
android.R.style.Theme_DeviceDefault_Wallpaper,
android.R.style.Theme_DeviceDefault_Wallpaper_NoTitleBar,
android.R.style.Theme_Dialog, android.R.style.Theme_Holo,
android.R.style.Theme_Holo_Dialog,
android.R.style.Theme_Holo_Dialog_MinWidth,
android.R.style.Theme_Holo_Dialog_NoActionBar,
android.R.style.Theme_Holo_Dialog_NoActionBar_MinWidth,
android.R.style.Theme_Holo_DialogWhenLarge,
android.R.style.Theme_Holo_DialogWhenLarge_NoActionBar,
android.R.style.Theme_Holo_InputMethod,
android.R.style.Theme_Holo_Light,
android.R.style.Theme_Holo_Light_DarkActionBar,
android.R.style.Theme_Holo_Light_Dialog,
android.R.style.Theme_Holo_Light_Dialog_MinWidth,
android.R.style.Theme_Holo_Light_Dialog_NoActionBar,
android.R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth,
android.R.style.Theme_Holo_Light_DialogWhenLarge,
android.R.style.Theme_Holo_Light_DialogWhenLarge_NoActionBar,
android.R.style.Theme_Holo_Light_NoActionBar,
android.R.style.Theme_Holo_Light_NoActionBar_Fullscreen,
android.R.style.Theme_Holo_Light_Panel,
android.R.style.Theme_Holo_NoActionBar,
android.R.style.Theme_Holo_NoActionBar_Fullscreen,
android.R.style.Theme_Holo_Panel,
android.R.style.Theme_Holo_Wallpaper,
android.R.style.Theme_Holo_Wallpaper_NoTitleBar,
android.R.style.Theme_InputMethod, android.R.style.Theme_Light,
android.R.style.Theme_Light_NoTitleBar,
android.R.style.Theme_Light_NoTitleBar_Fullscreen,
android.R.style.Theme_Light_Panel,
android.R.style.Theme_Light_WallpaperSettings,
android.R.style.Theme_NoDisplay, android.R.style.Theme_NoTitleBar,
android.R.style.Theme_NoTitleBar_Fullscreen,
android.R.style.Theme_NoTitleBar_OverlayActionModes,
android.R.style.Theme_Panel, android.R.style.Theme_Translucent,
android.R.style.Theme_Translucent_NoTitleBar,
android.R.style.Theme_Translucent_NoTitleBar_Fullscreen,
android.R.style.Theme_Wallpaper,
android.R.style.Theme_Wallpaper_NoTitleBar,
android.R.style.Theme_Wallpaper_NoTitleBar_Fullscreen,
android.R.style.Theme_WallpaperSettings,
android.R.style.Theme_WithActionBar };

private String[] mStyleNameArr = { "Theme", "Theme_Black",
"Theme_Black_NoTitleBar", "Theme_Black_NoTitleBar_Fullscreen",
"Theme_DeviceDefault", "Theme_DeviceDefault_Dialog",
"Theme_DeviceDefault_Dialog_MinWidth",
"Theme_DeviceDefault_Dialog_NoActionBar",
"Theme_DeviceDefault_Dialog_NoActionBar_MinWidth",
"Theme_DeviceDefault_DialogWhenLarge",
"Theme_DeviceDefault_DialogWhenLarge_NoActionBar",
"Theme_DeviceDefault_InputMethod", "Theme_DeviceDefault_Light",
"Theme_DeviceDefault_Light_DarkActionBar",
"Theme_DeviceDefault_Light_Dialog",
"Theme_DeviceDefault_Light_Dialog_MinWidth",
"Theme_DeviceDefault_Light_Dialog_NoActionBar",
"Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth",
"Theme_DeviceDefault_Light_DialogWhenLarge",
"Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar",
"Theme_DeviceDefault_Light_NoActionBar",
"Theme_DeviceDefault_Light_NoActionBar_Fullscreen",
"Theme_DeviceDefault_Light_Panel",
"Theme_DeviceDefault_NoActionBar",
"Theme_DeviceDefault_NoActionBar_Fullscreen",
"Theme_DeviceDefault_Panel", "Theme_DeviceDefault_Wallpaper",
"Theme_DeviceDefault_Wallpaper_NoTitleBar", "Theme_Dialog",
"Theme_Holo", "Theme_Holo_Dialog", "Theme_Holo_Dialog_MinWidth",
"Theme_Holo_Dialog_NoActionBar",
"Theme_Holo_Dialog_NoActionBar_MinWidth",
"Theme_Holo_DialogWhenLarge",
"Theme_Holo_DialogWhenLarge_NoActionBar", "Theme_Holo_InputMethod",
"Theme_Holo_Light", "Theme_Holo_Light_DarkActionBar",
"Theme_Holo_Light_Dialog", "Theme_Holo_Light_Dialog_MinWidth",
"Theme_Holo_Light_Dialog_NoActionBar",
"Theme_Holo_Light_Dialog_NoActionBar_MinWidth",
"Theme_Holo_Light_DialogWhenLarge",
"Theme_Holo_Light_DialogWhenLarge_NoActionBar",
"Theme_Holo_Light_NoActionBar",
"Theme_Holo_Light_NoActionBar_Fullscreen",
"Theme_Holo_Light_Panel", "Theme_Holo_NoActionBar",
"Theme_Holo_NoActionBar_Fullscreen", "Theme_Holo_Panel",
"Theme_Holo_Wallpaper", "Theme_Holo_Wallpaper_NoTitleBar",
"Theme_InputMethod", "Theme_Light", "Theme_Light_NoTitleBar",
"Theme_Light_NoTitleBar_Fullscreen", "Theme_Light_Panel",
"Theme_Light_WallpaperSettings", "Theme_NoDisplay",
"Theme_NoTitleBar", "Theme_NoTitleBar_Fullscreen",
"Theme_NoTitleBar_OverlayActionModes", "Theme_Panel",
"Theme_Translucent", "Theme_Translucent_NoTitleBar",
"Theme_Translucent_NoTitleBar_Fullscreen", "Theme_Wallpaper",
"Theme_Wallpaper_NoTitleBar",
"Theme_Wallpaper_NoTitleBar_Fullscreen", "Theme_WallpaperSettings",
"Theme_WithActionBar" };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mListView = (ListView) findViewById(R.id.test_list);
for (int i = 0; i < mStyleIdArr.length; i++) {
Button btnButton = new Button(this);
btnButton.setText(mStyleNameArr[i]);
}
ArrayAdapter<String> testAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mStyleNameArr);
mListView.setAdapter(testAdapter);
mListView.setOnItemClickListener(this);

}

//날짜 다이얼로그
private void showCalendarDialog(int style) {
Calendar calendar = Calendar.getInstance();

DatePickerDialog dialog = null;

dialog = new DatePickerDialog(mContext, style, mDateSetListener,
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));

dialog.show();

}

//시간 다이얼로그
private void showTimeDialog(int style) {
Calendar calendar = Calendar.getInstance();
TimePickerDialog dialog = null;
dialog = new TimePickerDialog(mContext, style, mTimeSetListener,
calendar.get(Calendar.HOUR_OF_DAY), 0, true);

dialog.show();

}

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub

}

};

private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// TODO Auto-generated method stub

}

};

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
Toast.makeText(this, "position" + position, Toast.LENGTH_SHORT).show();
if(isShowDatePickerDialog) {
showCalendarDialog(mStyleIdArr[position]);
}else{
showTimeDialog(mStyleIdArr[position]);
}
}


}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<ListView
android:id="@+id/test_list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>

</RelativeLayout>


728x90
반응형

/**파일 확장자 가져오기
* @param fileStr 경로나 파일이름
* @return*/
public static String getExtension(String fileStr){
String fileExtension = fileStr.substring(fileStr.lastIndexOf(".")+1,fileStr.length());
return TextUtils.isEmpty(fileExtension) ? null : fileExtension;
}

/**파일 이름 가져오기
* @param fileStr 파일 경로
* @param isExtension 확장자 포함 여부
* @return */
public static String getFileName(String fileStr , boolean isExtension){
String fileName = null;
if(isExtension)
{
fileName = fileStr.substring(fileStr.lastIndexOf("/"),fileStr.lastIndexOf("."));
}else{
fileName = fileStr.substring(fileStr.lastIndexOf("/")+1);
}
return fileName;
}


728x90
반응형

+ Recent posts