webview 뒤로가기 설정

프로그래밍/Android (Java)|2015. 11. 20. 08:26
반응형

import android.view.KeyEvent;


@Override

public boolean onKeyDown(int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
           if(webView.canGoBack()){
            webView.goBack();
           }else{
            webView.clearCache(false);
               finish();
           }
           return true;
       }
       return super.onKeyDown(keyCode, event);
}


파랑색 글자는 사용하는 명칭(?)으로 잘 맞추어 사용한다. 


[출처] 나랑블루 (http://newhouse.tistory.com/268)

 

반응형

댓글()

WebView에 배경이미지 적용하기

프로그래밍/Android (Java)|2015. 11. 19. 10:01
반응형

기본적인 WebView의 background는 white로 지정되어 있는것 같습니다.

따라서 webview의 background color를 0 또는 Color.TRANSPARENT 로 세팅하고

setBackgroundResource로 이미지를 지정해주시면, 설정된 이미지로 배경화면이 바뀐것을 확인할 수 있습니다.

예제 코드입니다.

즐프하세요~~

 

[출처] 스태커 (http://dasin.freeofsky.com/archives/12)

 

 

Color.BLACK 과 같이 대문자로 컬러를 사용해야 하며, 몇가지 정해진 색상밖에 사용이 불가능합니다.

반응형

댓글()

videoview 종료시 activity 종료 및 반복재생 방법

프로그래밍/Android (Java)|2015. 11. 19. 08:18
반응형

import android.media.MediaPlayer.OnCompletionListener;

 

(생략)

 

videoview.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {

 

         onBackPressed();  // 동영상 재생 종료시 activity 를 종료하고자 할때 사용


        // 반복을 원할 경우 바로 윗줄 제외하고 여기에서 Intent 로 VideoViewActivity 를 재호출

    }
});

 

 

반응형

댓글()

웹에서 액티비티 호출하기

프로그래밍/Android (Java)|2015. 11. 19. 08:12
반응형

웹앱을 만들다보면, 웹에서 안드로이드 앱의 특정 액티비티를 호출해야 하는 경우가 종종 발생한다. 

오늘은 HTML의 링크를 클릭했을 때, 안드로이드 액티비티를 호출하는 간단한 방식을 정리해 보도록 한다. 


웹뷰를 작성하는 코드는 안드로이드 웹뷰(WebView) 사용하기 를 참고하기 바란다. 

이 소스에 HTML 링크를 처리하는 부분을 추가할 것이기 때문이다. 


웹에서 액티비티 호출 방식

웹에서는 HTML의 <a> 태그를 활용해서 액티비티를 호출한다. 


<a href="app://...">Call Activity</a>

이런 형태로 호출하고, 안드로이드 액티비티에서 URL 로딩하는 부분에서 app://로 시작하는 것을 별도로 처리하면 된다. 


필요에 따라서 app:// 이후 문자열을 가지고 특정 파라미터를 전달하는 형태도 가능할 것이다. 


웹 HTML 소스

간단한 테스트를 위해서 app:// 링크를 가진 HTML 파일을 하나 생성한다. 

 

 
       <a href="app://application">Call Android Activity </a>    


웹에서 실행 후, 링크를 눌러보면 아무런 반응을 하지 않는다. 

이미지


안드로이드 코딩

안드로이드 웹뷰(WebView) 사용하기 에서 만든 MiniWebActivity에 관련 내용을 추가해 보도록 한다. 

웹의 링크를 받아서 다른 액티비티를 실행할 것이므로 인텐트(intent)를 사용해야 한다. 

이를 위해 ApplicationContext를 알아야 할 필요가 있다. 

 

 
public class MiniWebActivity extends Activity {

    private WebView mWebView;
    public Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mini_web);
        mContext = this.getApplicationContext();

        mWebView = (WebView)findViewById(R.id.webView);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl("http://www.word.pe.kr/home/callactivity.html");
        mWebView.setWebViewClient(new WebViewClientClass());
    }


5번째 줄에 mContext 변수를 선언하고, 11번째 줄에서 getApplicationContext()로 할당했다. 


이제 URL 로딩에서 app://으로 시작하는 부분을 처리해야 한다. 

안드로이드 웹뷰(WebView) 사용하기 에서 WebViewClient를 상속받아서 WebViewClientClass를 inner class로 구현한 것을 기억할 것이다. 

이 클래스의 URL 로딩을 오버라이드한 메소드에서 app://을 처리하면 된다. 

 

 
    private class WebViewClientClass extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("app://")) {
                Intent intent = new Intent(mContext.getApplicationContext(), MainActivity.class);
                startActivity(intent);
                return true;
            }
            else {
                view.loadUrl(url);
                return true;
            }
        }
    }


4~8번째 줄을 보면 URL에서 app://으로 시작할 경우, 

인텐트를 사용해서 MainActivity를 실행하도록 설정되어 있다. 

 


 


전체 소스를 살펴보면 다음과 같다. 

 

 
package kr.co.acronym.mini;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MiniWebActivity extends Activity {


    private WebView mWebView;
    public Context mContext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mini_web);
        mContext = this.getApplicationContext();

        mWebView = (WebView)findViewById(R.id.webView);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl("http://www.word.pe.kr/home/callactivity.html");
        mWebView.setWebViewClient(new WebViewClientClass());
    }


    private class WebViewClientClass extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("app://")) {
                Intent intent = new Intent(mContext.getApplicationContext(), MainActivity.class);
                startActivity(intent);
                return true;
            }
            else {
                view.loadUrl(url);
                return true;
            }
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }


}

 


[출처] http://blog.acronym.co.kr/m/post/529

 

 

 

반응형

댓글()

HTML을 안드로이드 웹뷰에 모두 보이게 하기

프로그래밍/Android (Java)|2015. 11. 19. 08:10
반응형

WebSettings settings =  webview.getSettings();

 

웹뷰가 html 컨텐츠가 웹뷰보다 클 경우 스크린 크기에 맞게 조정되도록 한다.
settings.setLoadWithOverviewMode(true);

 

웹뷰가 html의 viewport 메타 태그를 지원하게 한다.

settings.setUseWideViewPort(true);

 

 

[출처] http://blog.hansune.com/610

반응형

댓글()

webview 사용하기 (ProgressBar 로딩바 포함)

프로그래밍/Android (Java)|2015. 11. 17. 12:40
반응형

설명이 없어도 코드를 보면 바로 사용하실 수 있습니다.
여러가지 기능 중 가장 기본적인 코드이고, 자세한 내용은 Developer Android Reference 에서 보실 수 있습니다. 

 Activity Code & Layout XML Code

Activity

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package me.croute.webview;
 
import me.croute.R;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
 
 
/**
 * 웹뷰 사용 기본 예제
 *
 * @author croute
 * @since 2011.07.27
 */
public class WebViewExampleActivity extends Activity
{
    private static final String DEFAULT_URL = "http://croute.me";
     
    private ProgressBar mPbProgress;
    private WebView mWvBrowser;
         
     
    /* (non-Javadoc)
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_view_example_activity);
         
        mPbProgress = (ProgressBar)findViewById(R.id.web_view_example_activity_pb_progress);
        mWvBrowser = (WebView)findViewById(R.id.web_view_example_activity_wv_browser);
         
        mWvBrowser.getSettings().setJavaScriptEnabled(true);
        mWvBrowser.setWebViewClient(new WebViewClient());      
        mWvBrowser.loadUrl(DEFAULT_URL);       
         
        // 웹뷰의 진행 상태를 표시하기 위한 프로그레스바
        mWvBrowser.setWebChromeClient(new WebChromeClient()
        
               public void onProgressChanged(WebView view, int progress)
               
                   if (progress<100)
                   {
                       mPbProgress.setVisibility(ProgressBar.VISIBLE);
                   }
                   else if (progress==100)
                   {
                       mPbProgress.setVisibility(ProgressBar.GONE);
                   }
                   mPbProgress.setProgress(progress); 
               }  
        });
         
    }
 
}




Layout XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:background="#FFFFFF" >
    <ProgressBar
        android:id="@+id/web_view_example_activity_pb_progress"
        android:layout_width="fill_parent"
        android:layout_height="5dp"
        style="?android:attr/progressBarStyleHorizontal" />
    <WebView
        android:id="@+id/web_view_example_activity_wv_browser"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>





 

 ScreenShot & Project files

 

 

[출처] http://croute.me/458

반응형

댓글()

TextView 상, 하 여백 줄이기

프로그래밍/Android (Java)|2015. 11. 13. 10:06
반응형

일반적으로 아래와 같은 옵션을 줍니다.

 

.xml 사용시)

android:includeFontPadding="false"

 

.java 사용시)

setIncludeFontPadding( false );

 

하지만 위와 같이 해도 안될 경우 layout 에 아래 옵션을 사용하면 됩니다.

 

android:layout_marginTop="-3dp"
android:layout_marginBottom="-3dp"

 

반응형

댓글()

layout 에서 공백 채우기

프로그래밍/Android (Java)|2015. 11. 13. 09:55
반응형

가로 공백으로 예를 들면


<View
    android:layout_width="0dp"
    android:layout_height="match_parent"

   android:layout_weight="1" />

반응형

댓글()

Simple JSON Parsing Example in Android (리스트뷰, 그리드뷰 아님)

프로그래밍/Android (Java)|2015. 11. 11. 17:18
반응형

In this blog post, ill show you how to Retrieving JSON data and Displaying it in Android TextView.

My Other blog post on JSON Tutorial.

  1. Part I – What is JSON and how to code JSON data on Php
  2. Part II – How to retrieve a simplest JSON data in Android
  3. Part III – How to retrieve a JSON data to ListView in Android
  4. Part IV – How to retrieve a complex typed JSON data in Android
  5. Part V – How to retrieve a JSON data from a Secured Site with Basic Authentication
  6. Part VI – How to Pass a JSON data to Php as a Parameters

 

Please read Part I of this blog, there you can create JSON data in php. I’m using Example 1 from that blog in this tutorial for making this blog to be simple. Hope you have created JSON data in php, so lets get started with retrieving in Android.

Step 1: Create a new project File -> Android Project. While creating a new project give activity name as MainActivity and copy paste this code.

1 import org.json.JSONException;
2 import org.json.JSONObject;
3  
4 import android.app.Activity;
5 import android.app.ProgressDialog;
6 import android.os.AsyncTask;
7 import android.os.Bundle;
8 import android.widget.TextView;
9  
10 public class MainActivity extends Activity {
11 /** Called when the activity is first created. */
12  
14 String name, version;
15 TextView tv1;
16  
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21  
22 new JSONParse().execute();
23 }
24  
25 private class JSONParse extends AsyncTask<String, String, JSONObject> {
26 private ProgressDialog pDialog;
27 @Override
28 protected void onPreExecute() {
29 super.onPreExecute();
30 tv1 = (TextView) findViewById(R.id.textView1);
31  
32 pDialog = new ProgressDialog(MainActivity.this);
33 pDialog.setMessage("Loading Data ...");
34 pDialog.setIndeterminate(false);
35 pDialog.setCancelable(true);
36 pDialog.show();
37 tv1.setText("Getting Values Pls wait..");
38 }
39  
40 @Override
41 protected JSONObject doInBackground(String... args) {
42 JsonParser jParser = new JsonParser();
43 // Getting JSON from URL
44 JSONObject json = jParser.getJSONFromUrl(url);
45 return json;
46 }
47  
48 @Override
49 protected void onPostExecute(JSONObject json) {
50 try {
51 pDialog.dismiss();
52 name = json.getString("name");
53 version = json.getString("version");
54 tv1.setText(name + " - " + version);
55 } catch (JSONException e) {
56 e.printStackTrace();
57 }
58 }
59 }
60 }

Step 2: Create a new class, JsonParser.java and copy paste this code.

1 import java.io.BufferedReader;
2 import java.io.IOException;
3 import java.io.InputStream;
4 import java.io.InputStreamReader;
5 import java.io.UnsupportedEncodingException;
6  
7 import org.apache.http.HttpEntity;
8 import org.apache.http.HttpResponse;
9 import org.apache.http.client.ClientProtocolException;
10 import org.apache.http.client.methods.HttpPost;
11 import org.apache.http.impl.client.DefaultHttpClient;
12 import org.json.JSONException;
13 import org.json.JSONObject;
14  
15 import android.util.Log;
16  
17 public class JsonParser {
18 static InputStream is = null;
19 static JSONObject jObj = null;
20 static String json = "";
21  
22 // constructor
23 public JsonParser() {
24 }
25  
26 public JSONObject getJSONFromUrl(String url) {
27 // Making HTTP request
28 try {
29 // defaultHttpClient
30 DefaultHttpClient httpClient = new DefaultHttpClient();
31 HttpPost httpPost = new HttpPost(url);
32 HttpResponse httpResponse = httpClient.execute(httpPost);
33 HttpEntity httpEntity = httpResponse.getEntity();
34 is = httpEntity.getContent();
35 } catch (UnsupportedEncodingException e) {
36 e.printStackTrace();
37 } catch (ClientProtocolException e) {
38 e.printStackTrace();
39 } catch (IOException e) {
40 e.printStackTrace();
41 }
42 try {
43 BufferedReader reader = new BufferedReader(new InputStreamReader(
44 is, "iso-8859-1"), 8);
45 StringBuilder sb = new StringBuilder();
46 String line = null;
47 while ((line = reader.readLine()) != null) {
48 sb.append(line + "n");
49 }
50 is.close();
51 json = sb.toString();
52 } catch (Exception e) {
53 Log.e("Buffer Error", "Error converting result " + e.toString());
54 }
55 // try parse the string to a JSON object
56 try {
57 jObj = new JSONObject(json);
58 } catch (JSONException e) {
59 Log.e("JSON Parser", "Error parsing data " + e.toString());
60 }
61 // return JSON String
62 return jObj;
63 }
64 }

Step 3: Open your activity_main.xml and copy paste this code:

1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:paddingBottom="@dimen/activity_vertical_margin"
6 android:paddingLeft="@dimen/activity_horizontal_margin"
7 android:paddingRight="@dimen/activity_horizontal_margin"
8 android:paddingTop="@dimen/activity_vertical_margin" >
9  
10 <TextView
11 android:id="@+id/textView1"
12 android:layout_width="wrap_content"
13 android:layout_height="wrap_content"
14 android:layout_centerHorizontal="true"
15 android:layout_centerVertical="true"
16 android:text="Medium Text"
17 android:textAppearance="?android:attr/textAppearanceMedium" />
18  
19 </RelativeLayout>

Step 4: Open your AndroidManifest.xml and add Internet Permission.

1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.geeks.gallery.json_demoexample"
4 android:versionCode="1"
5 android:versionName="1.0" >
6  
7 <uses-sdk
8 android:minSdkVersion="16"
9 android:targetSdkVersion="19" />
10 <uses-permission android:name="android.permission.INTERNET"/>
11 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
12  
13 <application
14 android:allowBackup="true"
15 android:icon="@drawable/ic_launcher"
16 android:label="@string/app_name"
17 android:theme="@style/AppTheme" >
18 <activity
19 android:name=".MainActivity"
20 android:label="@string/app_name" >
21 <intent-filter>
22 <action android:name="android.intent.action.MAIN" />
23  
24 <category android:name="android.intent.category.LAUNCHER" />
25 </intent-filter>
26 </activity>
27 </application>
28  
29 </manifest>

ScreenShot:

Screenshot_2015-01-11-13-54-24

Download Source Code from here.

 

 

[출처] http://www.geeks.gallery/simple-json-parsing-example-in-android-part-ii/

 

반응형

댓글()

외부 이미지 (url) 출력하기

프로그래밍/Android (Java)|2015. 11. 6. 16:29
반응형

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.os.Handler;

import android.widget.ImageView;


public class MainActivity extends Activity {


    Handler handler = new Handler();


        @Override

        protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_main);

        Thread t = new Thread(new Runnable() {


        @Override

        public void run() {

            try {

                final ImageView imgSunny = (ImageView) findViewById(R.id.getImage);

                URL url = new URL("http://img.naver.net/static/www/u/2013/0731/nmms_224940510.gif");

                InputStream is = url.openStream();

                final Bitmap bm = BitmapFactory.decodeStream(is);

                handler.post(new Runnable() {

                    @Override

                    public void run() {

                        imgSunny.setImageBitmap(bm);

                    }

                });

                is.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

            }

        });

        t.start();


[출처http://cieneyes.tistory.com/435


반응형

댓글()

안드로이드의 android:layout_weight 속성

프로그래밍/Android (Java)|2015. 11. 6. 09:01
반응형

LinearLayout의 속성 중에 android:layout_weight 이라는 속성이 있는데요.

이 것을 이용하면 LinearLayout의 항목들 배치에 아주 도움이 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<LinearLayout
     android:orientation="horizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="#ffffffff"
     android:gravity="center|right"
     android:padding="1dp">
 
     <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/update_time"
      style="@style/text_item.preference"
      android:layout_weight="1"
      android:gravity="right" />
 
     <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/edit"/>
</LinearLayout>

layout_weight 란 한마디로 UI영역에서 차지하는 중요도라고 할 수 있습니다. 이 중요도 비중을 높이면 그만큼 많은 영역을 UI영역에서 차지할 수 있죠. 설정을하지 않으면 디폴트로 0으로 설정됩니다.

위의 코드에서 TextView의 layout_weight가 1이고 Button은 설정을 하지 않았습니다. 그러면 Button이 높이가 wrap_content로 설정되어 있으니까 먼저 필요한 영역을 차지한 후 나머지 영역은 모두 TextView로 채워집니다. 만약 TextView와 Button에 layout_weight를 모두 1로 두면 어떻게 될까요? 중요도가 1:1로 설정이 되니까 화면을 절반씩 나우어 가지게 됩니다. 사용하실때 3:4든 5:5든 정수값이기만하면 비율을 맞추어 줍니다. 
LinearLayout을 사용하면서 화면에 꽉차는 UI를 개발할 때는 필수품이라고 할 수 있겠죠~

그런데 만약 TextView의 layout_height를 wrap_content가 아닌 fill_parent로 하면 어떻게 될까요? 음 다른 분들은 다들 알고 계신지 모르겠는데 layout_weight를 줄때는 layout_height가 wrap_content를 쓰던지 아니면 0dp를 줘야 합니다.
전 이걸 모르고 fill_parent로 지정을 했더니 속성값이 반대로 움직이더군요.ㅋ
TextView와 Button부분의 layout_height를 fill_parent로 해두고 layout_weight를 조절 했더니 양쪽이 반대로 움직이더군요. 1:9로 두고 실행시키면 9:1이 되는...
꼭 반대로 동작하지는 않을지도 모르지만 어쨋든 정상적인 동작은 기대할 수가 없으니깐 절대 꼭 wrap_content나 0dp로 하시고 사용하세요. 전 이거 잡는데 하루 걸렸습니다. 레이아웃을 너무 복잡하게 만든후에 문제를 발견해서ㅋㅋ

그리고 한가지 더, wrap_content를 지정하고 화면 비율을 나눈 경우에는 레이아웃 안쪽에 많은 항목이 있어서 크기가 커질 경우에 비율을 무시하고 내용물의 크기 많큼 레이아웃이 커집니다. 안쪽에 많은 항목이 있으면 나눈 비율보다 커질 수 도 있는거죠. 그리고 0dp를 사용한 경우에는 정확히 설정한 비율까지만 보여지게 됩니다. 나머지 항목은 가려지게 되겠죠~



[출처] 달료~ | 쏜다 (http://gunwi.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9D%98-androidlayoutweight-%EC%86%8D%EC%84%B1)

 

반응형

댓글()