뒤로가기(Back 버튼) 두번 눌러 앱 종료하기

프로그래밍/Android (Java)|2015. 1. 27. 10:56
반응형

요즘 많은 어플들이 뒤로가기 버튼을 두번 눌러 앱을 종료시킨다. 
 종료하시겠습니까? 라는 확인창이 뜨고 확인을 눌러야 되는 번거로움이 없고, 잘못 종료버튼을 눌렀을 경우에도 토스트 알림창만 뜰뿐 별다른 방해요소가 없어서 참 좋은것 같다. 요즘 대부분의 앱이 이러한 종료 방식을 선택하고 있기때문에 한번 구현을 해보자.



 구현방법은 간단하다 뒤로가기 버튼 클릭시 현재시간을 저장하며 토스트 알림창을 띄워주고 한번더 눌렀을때 일정시간(예를들면 2초)가 지났는지 확인하고 일정시간이 지나지 않았을 경우 종료, 지났을 경우 알림창을 다시 띄워주면 된다.

0.    시간을 저장하는 변수(t) = 0;
1.    뒤로가기 버튼 (처음)클릭시 시간을 저장하는 변수(t) + 2000(2초)가 현재 시간보다 작다.
2-1. 알림창을 띄운다.('뒤로'버튼을 한번 더 누르시면 종료됩니다.)
2-2. 시간을 저장하는 변수(t)에 현재 시간을 저장한다.
3.    뒤로가기 버튼을 한번더 클릭
4-1. 현재 시간이 변수t + 2000보다 작으면 앱 종료
4-2. 현재 시간이 변수t + 2000보다 크면 t에 현재시간을 저장하고 알림창을 띄운다.


글로 보면 어렵더라도 소스를 보면 아마 바로 이해가 갈 것이다.

먼저 뒤로가기 버튼의 이벤트를 담당하는 클래스를 하나 만들었다.

BackPressCloseHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import android.app.Activity;
import android.widget.Toast;
 
public class BackPressCloseHandler {
 
    private long backKeyPressedTime = 0;
    private Toast toast;
 
    private Activity activity;
 
    public BackPressCloseHandler(Activity context) {
        this.activity = context;
    }
 
    public void onBackPressed() {
        if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
            backKeyPressedTime = System.currentTimeMillis();
            showGuide();
            return;
        }
        if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
            activity.finish();
            toast.cancel();
        }
    }
 
    public void showGuide() {
        toast = Toast.makeText(activity,
                "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT);
        toast.show();
    }
}


다음은 이 기능을 사용하려는 액티비티에서 넣어줘야 되는 소스이다. 사용하려는 액티비티에 onBackPressed()메소드를 생성하고 BackPressCloseHandler 클래스의 onBackPressed()메소드를 불러와주면 된다.

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends Activity {
 
    private BackPressCloseHandler backPressCloseHandler;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        backPressCloseHandler = new BackPressCloseHandler(this);
    }
 
    @Override
    public void onBackPressed() {
        //super.onBackPressed();
        backPressCloseHandler.onBackPressed();
    }
}

[출처] 기초 탄탄 영상털이's Story | 영상털이범 (http://dsnight.tistory.com/14)

반응형

댓글()

스크롤바 넣기 (ScrollView)

프로그래밍/Android (Java)|2015. 1. 27. 10:56
반응형

스크롤 할 부분을 ScrollView 로 감싸면 됩니다.

주의할 것은 ScrollView 내부에 Layout 이 하나만 들어 갈 수 있습니다.

그러므로 복잡한 레이아웃을 만들 경우 ScrollView 안의 Layout 속에 여러개의 Layout 을 만들면 됩니다.


/res/layout/activity_main.xml


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

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/sysdocu_main_layer"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:background="#ffffff">


<ScrollView

    android:id="@+id/scrollview"

    android:layout_width="match_parent"

    android:layout_height="match_parent">


<LinearLayout

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:background="#ffffff">


     <TextView android:id="@+id/history"

         android:layout_width="match_parent"

         android:layout_height="wrap_content"

         android:textSize="16dip"

         android:layout_margin="10dip"

         android:textColor="#000000"/>


     <TextView android:id="@+id/lblMessage" 

         android:layout_width="match_parent"

         android:layout_height="wrap_content"

         android:textSize="16dip"

         android:layout_margin="10dip"

         android:textColor="#000000"/>


</LinearLayout>


</ScrollView>


</LinearLayout> 


반응형

댓글()

액티비티 (activity) 재시작 재호출 재구동

프로그래밍/Android (Java)|2015. 1. 27. 10:55
반응형

현재 Activity 종료후 재호출 방법


finish();

startActivity(new Intent(this, SysdocuActivity.class));


위 소스로 되지 않을경우 아래와 같이 현재 액티비티명을 추가해줍니다.


startActivity(new Intent(SysdocuActivity.this, SysdocuActivity.class));



반응형

댓글()

xml 파일을 이용한 메뉴버튼 구현 (OptionsMenu)

프로그래밍/Android (Java)|2015. 1. 27. 10:55
반응형

MainActivity.java 파일 하나만으로도 메뉴 구현이 가능하지만

여기서는 xml 파일을 이용한 Options Menu를 구현해보도록 하겠습니다.


* 장점 : 구현이 쉬움

* 단점 : 메뉴 > 서브메뉴(다중 체크)를 구현해도 한 개의 Item 클릭시 창이 닫힘



res/menu/activity_main.xml 파일 생성


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

    <item

        android:id="@+id/setting"

        android:title="SETTING">

        <menu>

            <group android:id="@+id/menu_group" android:enabled="true" android:checkableBehavior="all">

                <item android:id="@+id/popup" android:title="POPUP" />

                <item android:id="@+id/notice" android:title="NOTICE" />

            </group>

        </menu>

    </item>

    <item

        android:id="@+id/clear"

        android:title="CLEAR" />

    <item

        android:id="@+id/exit"

        android:title="EXIT" />

</menu> 


* 아래 옵션을 사용하면 메뉴에 이미지 삽입도 가능합니다.

    android:icon="@drawable/icon_clear"



MainActivity.java 수정


import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.widget.Toast; 



public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}


  // Menu

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}


@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch(item.getItemId()) {

case R.id.popup:

if (item.isChecked()) item.setChecked(false);

else item.setChecked(true);

return true;

case R.id.notice:

if (item.isChecked()) item.setChecked(false);

else item.setChecked(true);

return true;

case R.id.clear:

DBManager GCMclear = new DBManager(this, "sysdocu.db", null, 1);

SQLiteDatabase db = GCMclear.getWritableDatabase();

db.execSQL("delete from message;");

db.close();

finish();

startActivity(new Intent(this, MainActivity.class));

return true; 

case R.id.quit:

finish();

return true;

default:

return super.onOptionsItemSelected(item);

}

}

}


반응형

댓글()

edittext 속성 - 기본값 입력 및 쓰기 금지 설정

프로그래밍/Android (Java)|2015. 1. 27. 10:54
반응형

android:text="sysdocu"    // 기본 입력값

android:editable="false"    // 쓰기(수정) 금지


반응형

댓글()

일반 텍스트 출력 (textview)

프로그래밍/Android (Java)|2015. 1. 27. 10:54
반응형

간단하게 하면 아래와 같습니다.

코드 작성 후에 필요한 layout 에서 sysdocu값 (내용: hahaha)을 가져다 쓰면 됩니다.


String IT = "hahaha";

TextView testView = (TextView)findViewById(R.id.sysdocu);

testView.setText(IT.toString());



SQLite 의 내용을 가져와 출력 하려면 아래와 같이 하면 됩니다.

String sql;

sql = "select * from message";

Cursor cursor;

cursor = db.rawQuery(sql, null);


StringBuffer sb = new StringBuffer();

if (cursor.moveToFirst()) {

do {

sb.append(cursor.getInt(0));

sb.append(" ");

sb.append(cursor.getString(1));

sb.append(" ");

sb.append(cursor.getString(2));

sb.append("\n");

} while (cursor.moveToNext());

}


TextView sysdocu = (TextView)findViewById(R.id.history);

sysdocu.setText(sb.toString());


cursor.close();

db.close(); 



반응형

댓글()

SQLite select 예제

프로그래밍/Android (Java)|2015. 1. 27. 10:54
반응형

package com.labbook.dbhw;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends Activity {
 SQLiteDatabase db;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);


  // 데이터베이스 파일 생성후 SQLiteDatabase 객체를 리턴하는 메소드

  db = openOrCreateDatabase("ok", MODE_PRIVATE, null);
  // 테이블 생성하고
  String sql = "create table if not exists hwtable(no integer,name text)";
  db.execSQL(sql);
  // 데이터 추가한 후
  sql = "insert into hwtable values(1,'최민식')";
  db.execSQL(sql);
  sql = "insert into hwtable values(2,'조영언')";
  db.execSQL(sql);
  sql = "insert into hwtable values(3,'이상희')";
  db.execSQL(sql);
  sql = "insert into hwtable values(4,'이광표')";
  db.execSQL(sql);
  sql = "insert into hwtable values(5,'이보라')";
  db.execSQL(sql);
  sql = "insert into hwtable values(6,'김현담')";
  db.execSQL(sql);
  // 데이터를 조회한 것임
  sql = "select * from hwtable";
  Cursor cursor = db.rawQuery(sql, null);// cursor는 BOF(Begin Of File)
  StringBuffer sb = new StringBuffer();
  // 첫번째 행으로 이동
  if (cursor.moveToFirst()) {// notes 테이블에 데이터가 존재한다면
   do {// 존재하는 데이터를 모두 조회하기 위해서 반복문
    sb.append(cursor.getInt(0));
    sb.append(cursor.getString(1));
    sb.append("\n");
   } while (cursor.moveToNext());// 다음 행으로 이동
  }

  TextView tv = new TextView(this);// 더이상 데이터가 존재하지 않으면 반복문에서 벗어남
  tv.setText(sb.toString());
  setContentView(tv);// 텍스트 뷰를 엑티비티에 출력할 뷰로 설정


 }

}



[출처] http://cafe.naver.com/changetheworld02/256

반응형

댓글()

SQLite 에 select 방법과 insert 및 update 방법

프로그래밍/Android (Java)|2015. 1. 27. 10:54
반응형

DB.rawQuery 와 DB.execSQL - select 문과 insert, update 문의 실행

1. db.rawQuery(SQL쿼리) - select 문과 같이 결과값을 얻는 경우

Ex)
Cursor cur = db.rawQuery("select * from Table1",null)

2. db.execSQL(SQL쿼리) - insert, upadate 와 같이 결과 값이 없는 경우

Ex)
db.execSQL(updatae table1 set selFlag = "true"

단순한 것 같지만..
이것도 모르면 엄청 헤멘다...


[출처] http://memesong.blogspot.kr/


반응형

댓글()

스마트폰 자신의 핸드폰 번호 가져오기

프로그래밍/Android (Java)|2015. 1. 27. 10:53
반응형

AndroidManifest.xml 파일에 아래 내용 추가


<!-- Read Phone State -->

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 



사용할 파일(.java)에 아래 내용 추가


import android.content.Context;

import android.telephony.TelephonyManager;


// Read Phone Number

public String getPhoneNumber() {

    TelephonyManager mgr = (TelephonyManager)     getSystemService(Context.TELEPHONY_SERVICE);

    String SysdocuPhone = mgr.getLine1Number();

    SysdocuPhone = SysdocuPhone.substring(SysdocuPhone.length()-10,SysdocuPhone.length());

    SysdocuPhone = "0" + SysdocuPhone;

    return mgr.getLine1Number();

} 



반응형

댓글()

다른 Activity 호출하기

프로그래밍/Android (Java)|2015. 1. 27. 10:53
반응형

MainActivity.java 파일을 수정하여

MainActivity 에서 RegisterActivity 를 호출하는 방법


Intent in=new Intent(MainActivity.this, SysdocuActivity.class);

startActivity(in);

finish();


※ 설명

Intent(현재 Activity.this, 대상 Activity.class);


반응형

댓글()

안드로이드 MAIN Activity 변경

프로그래밍/Android (Java)|2015. 1. 27. 10:49
반응형

안드로이드 프로젝트를 생성하여 메인 액티비티를 만들어 (혹은 자동으로 생성된) 개발하게 된다.
작업을 해오다가 별도로 추가한 액티비티를 메인으로 변경하고 싶을 경우가 있다.

이런 경우에는 AndroidManifest.xml 소스를 열어 아래와 같이 수정하자.

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".NewActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>

        </activity>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

</application>

원래 MainActivity가 메인 액티비티였으나, 후에 추가된 NewActivity를 메인 액티비티로 변경한 모습이다.


<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>


를 메인 액티비티가 될 곳으로 옮기는 작업으로 매인 액티비티를 옮길 수 있다.


[출처] 어린왕자와 여우 | 어린왕자 (http://tiger5net.egloos.com/viewer/5838789)

반응형

댓글()