jaehwa

jaehwa.egloos.com

포토로그 마이가든



[JS]Class 생성을 위한 유틸 - defineClass 자바스크립트


회사에서 자바스크립틀를 올해부터 완전 열심히 쓰고 있다. 
클래스를 만드는데 있어서 "자바스크립트 완벽가이드"의 아래 코드를 사용해보았다. 
아래 코드로 쉽게 클래스 구조를 사용해보려고 한다. 


/**
 * defineClass() -- 자바스크립트 클래스를 정의하기 위한 유틸리티 함수
 *
 * 이 함수는 유일한 전달인자로 객체 하나가 넘어오기를 기대한다.
 * 그 객체에 있는 테이터를 기반으로 새로운 자바스크립트 클래스를 정의하고
 * 새 클래스의 생성자 함수를 반환한다.
 * 이 함수는 클래스를 정의하는 반복적인 작업을 처리한다.
 * 이 작업에는 상속을 제대로 받기 위해 프로토타입 객체를 설정하는 것과
 * 다른 타입에서 메서드를 복하해오는 일 등이 포함된다.
 *
 * 전달인자로 넘어오는 객체에는 다음 프로퍼티 모두 또는 일부가 있어야 한다.
 *
 *      name : 정의되는 클래스의 이름, 만약 이 값이 기술되어 있다면,
 *             프로토타임 객체에 있는 classname 프로퍼티에 저장된다.
 *
 *    extend : 확장될 클래스의 생성자. 만약 이입이 빠져있다면 Object() 생성자가 사용된다.
 *             이 값은 프로토타입 객체의 superclass 프로퍼티에 저장된다.
 *
 * construct : 클래스의 생성자 함수. 이것이 빠져있으면 새로운 빈 함수가 사용된다.
 *             이 값은 나중에 이 함수의 반환값이 되며 프로토타입 객체의 constructor프로퍼티에도 저장된다.
 *
 *   methods : 클래스를 위한 인스턴스 메서드들(그리고 공유된 다른 프로퍼티들)을 지정하는 객체.
 *             이 객체의 프로퍼티들은 클래스의 프로토타입 객체로 복사된다.
 *             만약 이것이 빠져있으면 대신 빈 객체가 사용된다. 프로퍼티 이름인 classname과 superclass,
 *             constructor는 예약되어 있는 이름이며 이 객체에서 사용되서는 안된다.
 *
 *   statics : 클래스를 위한 정석 메서드들(그리고 정적인 다른 프로퍼티들)을 지정하는 객체.
 *             이 객체의 프로퍼티는 생성자 함수의 프로퍼티가 된다.
 *             만약 이것이 빠져있으면, 빈 객체가 대신 사용된다.
 *
 *   borrows : 생성자 함수의 배열 혹은 생성자 함수.
 *             주어진 클래스의 인스턴스 메서드들은 새 클래스가 주어진 클래스의 메서드를 빌려갈 수 있게
 *             새 클래스의 프로토타입 객체로 복사된다. 생성자는 주어진 순서대로 처리되기 때문에 배열의
 *             마지막에 있는 클래스의 메서드는 배열의 앞에 있는 클래스의 메서드를 덮어쓸 수 있다.
 *             빌려온 메서드는 위의 methods객체에 있는 프로퍼티보다 먼저 프로토타입 객체에 저장된다는 것을
 *             주목하라. 따라서, methods 객체에 기술되어 있는 메서드는 빌려온 메서드를 덮어쓸 수 있다.
 *             만약 이 프로퍼티가 지정되지 않으면 아무런 메서드도 빌려오지 않는다.
 *
 *  provides : 생성자 함수의 배열 혹은 생성자 함수.
 *             프로토타입 객체가 완전히 초기화되고 나면, 이 함수는 프로토타입이 가진 메서드의 이름과
 *             전달인자의 수가 이 클래스들의 각각이 정의한 인스턴스 메서드와 일치하는지 검증한다.
 *             아무런 메서드도 복사되지는 않는다.
 *             이것은 단순히 이 클래스가 주어진 클래스의 기능을 '제공한다.'라고 주장하는 바와 같다.
 *             만약 이 주장이 잘못된 것이라면 이 메서드는 예외를 발생시킨다.
 *             아무런 예외도 발생되지 않으면(오리 타이핑을 사용하여) 새 클래스의 인스턴스는 다른 타입의
 *             인스턴스로도 생각할 수 있다. 이 프로퍼티가 기술되지 않으면 검증은 수행되지 않는다.
 */
function defineClass(data) {
// 전달인자 객체에서 우리가 사용할 필드를 추출한다.
// 기본값을 설정한다.
var classname = data.name;
var superclass = data.extend || Object;
var constructor = data.construct || function {};
var methods = data.methods || {};
var statics = data.statics || {};
var borrows;
var provides;

// borrows는 생성자 한개이거나 생성자의 배열일 수 있다.
if(!data.borrows) borrows = [];
else if(data.borrows instanceof Array) borrows = data.borrows;
else borrows = [data.borrows];

// provides 프로퍼티에 대해서도 똑같은 일을 수행한다.
if(!data.provides) provides = [];
else if(data.provides instanceof Array) provides = data.provides;
else provides = [data.provides];

// 새로 만들어질 클래스의 프로토타입이 될 객체를 생성한다.
var proto = new superclass();

// 새로운 프로토타입 객체의 프로퍼티 중 상속받지 않은 것은 삭제한다.
for(var p in proto)
if(proto.hasOwnProperty(p)) delete proto[p];

// 믹스인 클래스에서 프로토타입으로 메서드를 복사해서 빌려온다.
for(var i = 0; i < borrows.length; i++) {
var c = data.borrows[i];
borrows[i] = c;
// 메서드 프로퍼티들을 c의 프로토타입에서 우리가 만든 프로토타입으로 복사한다.
for(var p in c.prototype) {
if(typeof c.prototype[p] != "function") continue;
proto[p] = c.prototype[p];
}
}

// 인스턴스 메서드를 프로토타입 객체로 복사한다.
// 이 작업은 믹스인 클래스의 메서드를 덮어쓸 수도 있다.
for(var p in methods) proto[[p] = methods[p];

// 프로토타입의 예약된 프로퍼티인 constructor와 superclass, classname을 설정한다.
proto.constructor = constructor;
proto.superclass = superclass;
// classname는 이름이 실제로 기술되어 있을 때만 설정된다.
if(classname) proto.classname = classname;

// 우리가 만든 프로토타입이 제공하기로 된 모든 메서드를 제종하는 지 검증한다.
for(var i = 0; i < provides.length; i++) {
var c = provides[i];
for(var p in c.prototype) { // 각 프로퍼티에 대해서
if(typeof c.prototype[p] != "function") continue; // 오로지 메서드만
if(p == "constructor" || p == "superclass") continue;
// 같은 이름의 메서드가 있고, 선언된 전달인자의 수가 같은지를 검사한다.
// 만약 그렇다면 계속 진행한다.
if(p in proto && typeof proto[p] == "function" &&
proto[p].length == c.prototype[p].length) continue;
// 그렇지 않다면 예외를 발생시킨다.
throw new Error("Class " + classname + " does not provide method" + c.classname + "." + p);
}
}

// 프로토타입 객체와 생성자 함수를 연결시킨다.
constructor.prototype = rpoto;

// 정적인 프로퍼티를 생성자로 복사한다.
for(var p in statics) constructor[p] = data.statics[p];

// 마지막으로 생성자 함수를 반환한다.
return constructor;

} // defineClass END

공유하기 버튼

 

안드로이드 전체 화면 관련 설정 안드로이드 SDK


안드로이드 애플리케이션에서는 상태바(StatusBar?), 타이틀바(TitleBar?) 출력을 조절 할 수 있습니다. 조절할 수 있는 방법은 다음과 같습니다.

  1. 미리 정의된 Theme 사용하기
    1. 타이틀바 숨기기
      <activity android:name=".MyActivity"android:theme="@android:style/Theme.NoTitleBar"  >
    2. 타이틀바, 상태바 모두 숨기기
      <activity android:name=".MyActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  >
  1. 내가 정의한 Theme 에서 설정하기
    1. Title Bar만 없는 상태로 만들기
      <item name="windowNoTitle">true</item>
  2. Status Bar와 Title Bar 모두 없는 상태 만들기
    <item name="windowFullscreen">true</item>
  1. Java Code에서 설정하기
    1. Title Bar 없는 상태로 만들기
      requestWindowFeature(Window.FEATURE_NO_TITLE);
    2. Status Bar 없는 상태로 만들기 (Theme 설정과 다른 것은 Fullscreen Flag를 주더라도 Title Bar는 남아있습니다. )
      getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

공유하기 버튼

 

Android emulator에서 SD card 사용하기 안드로이드 Tool


1. SD card 만들기
cmd : mksdcard  
ex    : mksdcard 1024M sdcard1.iso

2. 생성된 SD card Emulator 에 적용하기
cmd : emulator -sdcard  
ex    : emulator –sdcard sdcard1.iso  

3. SD card 에 파일 넣기
cmd : adb push /sdcard
ex    : adb push text.txt /sdcard 

4. SD card 에서 파일 가져오기
cmd : adb pull /sdcard 
ex    : adb pull /sdcard text.txt


공유하기 버튼

 

안드로이드 애플리케이션 설치/삭제 요청하기 안드로이드 SDK

안드로이드에서는 간단하게 애플리케이션 설치/삭제를 요청할 수 있다.

안드로이드 애플리케이션 설치/삭제 요청

  • 안드로이드에서는 설치 관련 패키지 애플리케이션을 지원한다.
  • 안드로이드에서는 인텐트를 통해서 설치/삭제 애플리케이션을 사용할 수 있다.
  • 사용법
    1. 설치
      File apkFile = new File("설치할 APK 파일");
      //예제 File apkFile = new File("/data/data/com.infraware.sample/com_infraware_triangle.apk");
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
      startActivity(intent);
    2. 삭제
      Intent i = new Intent(Intent.ACTION_DELETE);
      i.setData(Uri.parse("package:삭제할 애플리케이션의 패키지명"));
      //예제 i.setData(Uri.parse("package:com.infraware.triangle"));
      startActivity(i);


공유하기 버튼

 

안드로이드 자바스크립트 확장 : 웹문서에서 안드로이드 어플리케이션에 접근하기 안드로이드 WebView

안드로이드에서 자바스크립트 확장 지원여부를 찾고 있었다.
아래 글로 쉽게 확인을 하였다. 이제 구현을 해봐야지...^^

안드로이드 자바 스크립트 확장

  • 안드로이드에서 자바스크립트 확장을 지원하고 있다.
  • 간단하게 말하면 웹페이지에서 안드로이드의 클래스 메서드를 호출할 수 있다.
  • 테스트를 해보니 String 파라메터도 잘 전달 받을 수 있었다. (샘플이 간단해서 아래에 중요한 핵심 부분만 첨부한다.)

  1. 안드로이드 애플리케이션
    mWebView = (WebView)findViewById(R.id.webview);
    ...
    mWebView.addJavascriptInterface(new JavaScriptExtention(), "android");
    ...
    public final class JavaScriptExtention{
    JavaScriptExtention(){}

    public void hello() {
    Log.d("TEST", "Hello~ called funtion by JavaScipt");
    }

    public void helloWithParam(final String arg) { // must be final
    Log.d("TEST", "Hello~ called funtion by JavaScipt arg:"+arg);
    }
    }
  2. Web Contents
    <script language="javascript">
    function helloJavaEx(){
    window.android.hello();
    window.android.helloWithParam("this is Text!");
    } // vibration()
    </script>
    ...
    <input type="button" value="JavaEX테스트" onClick="javascript:helloJavaEx();"/>




아래글 출처 : http://swilly.tistory.com/39

안드로이드 어플리케이션에서 WebView를 이용해 웹문서를 호출시, 해당 웹문서상에서 안드로이드 어플리케이션에 접근이 가능합니다.

JavascriptInterfaceTest.java
...
public final class JavascriptInterfaceTest {
  ...
  public void vibration() {
    Vibrator vib = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
    vib.vibrate(500);
  } // viberation()
  ...
} // class JavascriptInterfaceTest

위와같이 Javascript의 DOM Object에 바인딩할 클래스를 생성합니다.

WebView view = (WebView)findViewById(R.id.web_view);
WebSettings settings = view.getSettings();
settings.setJavascriptEnabled(true);
view.addJavascriptInterface(new JavascriptInterfaceTest(context), "android");
위와같이 addJavascriptInterface를 이용해 생성한 객체를 android라는 명칭으로 자바스크립트에 바인딩할 수 있습니다.

<script language="javascript">
function vibration(){
    window.android.vibration();
} // vibration()
</script>
...
<input type="button" value="떨린다!" onClick="javascript:vibration();"/>
위와같이 window.[인터페이스명].[메소드] 와 같은 형식으로 바인딩해놓은 객체의 메소드 호출이 가능합니다.


공유하기 버튼

 

1 2 3 4 5 6 7 8 9 10



애드센스 광고

애드센스 광고(링크단위)