{"id":16610,"date":"2014-04-18T13:07:14","date_gmt":"2014-04-18T10:07:14","guid":{"rendered":"http:\/\/www.gncz.net\/?p=16610"},"modified":"2014-05-26T17:25:33","modified_gmt":"2014-05-26T14:25:33","slug":"android-studio-webview-yapimi-1","status":"publish","type":"post","link":"https:\/\/gncz.net\/index.php\/android-studio-webview-yapimi-1.html","title":{"rendered":"Android Studio WebView Yap\u0131m\u0131 -1"},"content":{"rendered":"<p>Merhaba Arkada\u015flar;<\/p>\n<p>Bu yaz\u0131m\u0131zda, android&#8217;de en \u00e7ok kullan\u0131lan nesnelerden biri olan webviewlardan bahsedece\u011fiz ve ufak bir uygulamaya giri\u015f yapaca\u011f\u0131z.<\/p>\n<p>Webview&#8217;lar, bir web sitesini uygulama i\u00e7erisinden \u00e7a\u011f\u0131rmak ve uygulama i\u00e7erisinde a\u00e7mak i\u00e7in kullan\u0131lan nesnelerdir. K\u0131sacas\u0131, uygulamaya ait browser da diyebiliriz.<\/p>\n<p>Peki neden webview kullan\u0131l\u0131r? Bu sorunun bir \u00e7ok cevab\u0131 olmakla birlikte en \u00e7ok kullan\u0131m sebebi: responsive olan web sayfalar\u0131n\u0131; sanki native bir uygulamaym\u0131\u015f gibi uygulama i\u00e7erisinden \u00e7a\u011f\u0131rarak k\u0131sa zamanda \u00e7ok i\u015f yapma amac\u0131d\u0131r. Bu durumun maliyet+zaman gibi kazan\u00e7l\u0131 y\u00f6nleri olsa da; yava\u015fl\u0131k ve fonksiyonelli\u011fi azaltma gibi dezavantajl\u0131 y\u00f6nleri de bulunmaktad\u0131r.<\/p>\n<p>Bizim yapaca\u011f\u0131m\u0131z webview&#8217;\u0131n \u00f6zellikleri \u015funlar olacak:<\/p>\n<p>1 &#8211; Web sayfas\u0131n\u0131 \u00e7a\u011f\u0131racak (Hadi Can\u0131m!)<\/p>\n<p>2-Splash Screen&#8217;i olacak<\/p>\n<p>3- Sayfalar Aras\u0131 Ge\u00e7i\u015fte ve Yeni Sayfalar Y\u00fcklenirken Donup Kalmayacak: Resim+ ProgressBar ile kullan\u0131c\u0131y\u0131 bekletecek.<\/p>\n<p>4- Download Manager&#8217;\u0131 Kullacak, b\u00f6ylece telefonun belle\u011fine dosya kaydedebilecek.<\/p>\n<p>5-Home tu\u015funa bast\u0131\u011f\u0131m\u0131zda notification \u00e7\u0131kacak, geri tu\u015funa bast\u0131\u011f\u0131m\u0131zda uygulamadan \u00e7\u0131kacak.<\/p>\n<p>\u015eimdi, yeni bir uygulama olu\u015fturarak ba\u015flayal\u0131m:<\/p>\n<p>File&#8211;&gt;New Project diyerek:<\/p>\n<p>Proje Ad\u0131m\u0131z\u0131:<\/p>\n<p>Package Name&#8217;imizi(\u00d6nemli: Burada girece\u011finiz paket ad\u0131 android markette ba\u015fka bir uygulamada bulunmamal\u0131d\u0131r. Kendinize ait bir paket ad\u0131 k\u0131saltman\u0131z olsun.Aksi takdirde, package name&#8217;i sonradan de\u011fi\u015ftirmek bazen s\u0131k\u0131nt\u0131lara yol a\u00e7abiliyor.)<\/p>\n<p>Minimum SDK&#8217;m\u0131z\u0131: API 9 Tavsiyemdir<\/p>\n<p>Target SDK&#8217;m\u0131z\u0131 belirliyoruz.<\/p>\n<p><a href=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z.png\"><img loading=\"lazy\" class=\"alignnone size-medium wp-image-16611\" src=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-300x168.png\" alt=\"Ba\u015fl\u0131ks\u0131z\" width=\"300\" height=\"168\" srcset=\"https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-300x168.png 300w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-1024x575.png 1024w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-97x55.png 97w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-600x337.png 600w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z-900x506.png 900w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z.png 1366w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Buradan Sonra next-next diyerek ilerliyoruz; taaa ki Activity Se\u00e7imine kadar. Burada Blank Activity ve bir sonraki ekranda Navigation Type&#8217;\u0131 None Se\u00e7iyoruz.<\/p>\n<p><a href=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1.png\"><img loading=\"lazy\" class=\"alignnone size-medium wp-image-16612\" src=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-300x168.png\" alt=\"Ba\u015fl\u0131ks\u0131z\" width=\"300\" height=\"168\" srcset=\"https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-300x168.png 300w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-1024x575.png 1024w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-97x55.png 97w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-600x337.png 600w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1-900x506.png 900w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z1.png 1366w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Evet Arkada\u015flar Projemizi Olu\u015fturduk.<\/p>\n<p>Layout Dizininde fragment_main ve activity_main ad\u0131nda iki layoutumuz olacak. Biz fragment _main&#8217;i devre d\u0131\u015f\u0131 b\u0131rakaca\u011f\u0131z, \u00e7\u00fcnk\u00fc bu dersimizde hen\u00fcz fragment&#8217;lara ge\u00e7i\u015f yapmayaca\u011f\u0131z.<\/p>\n<p>Activity_main i\u00e7erisine gelip yapt\u0131\u011f\u0131m\u0131z i\u015fleri s\u0131ral\u0131yorum :<\/p>\n<p>1-Bir tane Relative Layout yerle\u015ftirdik, y\u00fckseklik ve geni\u015fli\u011fini fill_parent yaparak ekran\u0131n tamam\u0131n\u0131 kaplamas\u0131n\u0131 da\u011flad\u0131k<\/p>\n<p>2-Relative layout \u00fczerine, center olarak konumlanacak \u015fekilde bir webview yerle\u015ftirdik.<\/p>\n<p>Ve activity_main&#8217;in xml kodlar\u0131 \u015fu \u015fekilde oldu:<\/p>\n<pre class=\"lang:java decode:true\" title=\"Activity_main\">&lt;FrameLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n    android:id=\"@+id\/container\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    tools:context=\"pkg.dernekleristanbul.MainActivity\"\r\n    tools:ignore=\"MergeRootFrame\" &gt;\r\n\r\n    &lt;RelativeLayout\r\n        android:layout_width=\"fill_parent\"\r\n        android:layout_height=\"fill_parent\"\r\n        android:layout_gravity=\"center\"&gt;\r\n\r\n        &lt;WebView\r\n            android:layout_width=\"fill_parent\"\r\n            android:layout_height=\"fill_parent\"\r\n            android:id=\"@+id\/webView\"\r\n            android:layout_alignParentTop=\"true\"\r\n            android:layout_alignParentBottom=\"true\"\r\n            android:layout_alignParentRight=\"true\"\r\n            android:layout_alignParentEnd=\"true\"\r\n            android:layout_alignParentLeft=\"true\"\r\n            android:layout_alignParentStart=\"true\" \/&gt;\r\n    &lt;\/RelativeLayout&gt;\r\n&lt;\/FrameLayout&gt;<\/pre>\n<p>\u015eimdi layoutlarda i\u015fimiz bitti. \u015eu Keilde bir g\u00f6r\u00fcnt\u00fc olu\u015facak:<\/p>\n<p><a href=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3.png\"><img loading=\"lazy\" class=\"alignnone size-medium wp-image-16614\" src=\"http:\/\/www.gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-300x168.png\" alt=\"Ba\u015fl\u0131ks\u0131z\" width=\"300\" height=\"168\" srcset=\"https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-300x168.png 300w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-1024x575.png 1024w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-97x55.png 97w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-600x337.png 600w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3-900x506.png 900w, https:\/\/gncz.net\/wp-content\/uploads\/2014\/04\/Ba\u015fl\u0131ks\u0131z3.png 1366w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Buradaki i\u015fimiz bitti.<\/p>\n<p>\u015eimdi s\u0131ra java classlar\u0131m\u0131z\u0131n oldu\u011fu MainActivity&#8217;e geldi.<\/p>\n<p>OnCreate olay\u0131nda ufak bir de\u011fi\u015fiklik yaparak fragment&#8217;\u0131 \u00e7a\u011f\u0131rm\u0131yoruz. \u00c7\u00fcnk\u00fc kullanmam\u0131za bu uygulamada gerek yok.<\/p>\n<pre class=\"lang:java decode:true\" title=\"OnCreate Eski Hali\">@Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n\r\n        if (savedInstanceState == null) {\r\n            getSupportFragmentManager().beginTransaction()\r\n                    .add(R.id.container, new PlaceholderFragment())\r\n                    .commit();\r\n        }\r\n    }<\/pre>\n<p>Ve de\u011fi\u015fiklikten Sonraki OnCreate:<\/p>\n<pre class=\"lang:java decode:true\">@Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n\r\n    }<\/pre>\n<p>&nbsp;<\/p>\n<p>\u015eimdi bu b\u00f6l\u00fcmde yapacaklar\u0131m\u0131z\u0131 \u015fu \u015fekilde s\u0131ralayabiliriz:<\/p>\n<p>1- Layout&#8217;taki webview&#8217;\u0131 bir nesneye atayaca\u011f\u0131z,<\/p>\n<p>2-Olu\u015fturdu\u011fumuz nesneyi web sayfas\u0131na \u00a0y\u00f6nlendirece\u011fiz,<\/p>\n<p>3-Webview nesnesinin url&#8217;i de\u011fi\u015fti\u011finde (ShouldOverrideUrlLoading oldu\u011funda) yap\u0131lacak i\u015flemleri ve denetimleri belirleyece\u011fiz.<\/p>\n<p>Bu i\u015flemleri yapmay\u0131 teker teker anlatmak yerine MainActivity Class&#8217;\u0131m\u0131z\u0131 payla\u015fsam \u00e7ok \u00e7ok daha iyi olacak zannedersem.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Activity_main\">\u00a0\r\n\r\npackage pkg.gncweb;\r\n\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\nimport android.net.MailTo;\r\nimport android.net.Uri;\r\nimport android.os.Handler;\r\nimport android.support.v7.app.ActionBarActivity;\r\nimport android.support.v7.app.ActionBar;\r\nimport android.support.v4.app.Fragment;\r\nimport android.os.Bundle;\r\nimport android.view.LayoutInflater;\r\nimport android.view.Menu;\r\nimport android.view.MenuItem;\r\nimport android.view.View;\r\nimport android.view.ViewGroup;\r\nimport android.os.Build;\r\nimport android.webkit.WebSettings;\r\nimport android.webkit.WebView;\r\nimport android.webkit.WebViewClient;\r\nimport android.widget.Toast;\r\n\r\npublic class MainActivity extends ActionBarActivity {\r\nWebView tarayici;\r\n@Override\r\nprotected void onCreate(Bundle savedInstanceState) {\r\nsuper.onCreate(savedInstanceState);\r\nsetContentView(R.layout.activity_main);\r\n\r\ntarayici = new WebView(this);\r\ntarayici=(WebView)findViewById(R.id.webView);\r\ntarayici.getSettings().setJavaScriptEnabled(true); \/\/ Webview \u00fczerinde JavaScriptleri aktif ediyoruz.\r\ntarayici.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); \/\/Cache olarak herhangi bir \u015fifre vb. bir \u015fey tutmuyor.\r\n\r\nWebViewClient mWebClient = new WebViewClient() {\r\n@Override\r\npublic void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {\r\ntry {\r\nwebView.stopLoading();\r\n} catch (Exception e) {\r\n}\r\ntry {\r\nwebView.clearView();\r\n} catch (Exception e) {\r\n}\r\nif (webView.canGoBack()) {\r\nwebView.goBack();\r\n}\r\nwebView.loadUrl(\"http:\/\/www.gncz.net\/\"); \/\/Webview'\u0131n y\u00f6nlendirilece\u011fi sayfa\r\nsuper.onReceivedError(webView, errorCode, description, failingUrl);\r\n}\r\n@Override\r\npublic boolean shouldOverrideUrlLoading(WebView view, String url) {\r\n\/\/Sayfa(URL) her de\u011fi\u015fti\u011finde bu fonksiyon \u00e7al\u0131\u015facakt\u0131r.\r\n\r\n\u00a0\r\n\r\n\u00a0\r\n\r\nif(url.startsWith(\"mailto:\")){\/\/E\u011fer ki, link mailto ile ba\u015fl\u0131yorsa...\r\nMailTo mt = MailTo.parse(url);\r\nIntent i = newEmailIntent(MainActivity.this, mt.getTo(), mt.getSubject(), mt.getBody(), mt.getCc());\r\nstartActivity(i);\r\nview.reload();\r\nreturn true;\r\n}\r\nif (url.contains(\"rtsp\")) { \/\/ e\u011fer ki linl rtsp ile ba\u015flayan bir video ya da ranyo linki ise...\r\nUri uri = Uri.parse(url);\r\nIntent intent = new Intent(Intent.ACTION_VIEW, uri);\r\n\r\nstartActivity(intent);\r\n}\r\nif(url.startsWith(\"tel:\")) \/\/ Telefon ile arama intent i\r\n{\r\nIntent intent2 = new Intent(Intent.ACTION_VIEW,\r\nUri.parse(url));\r\nstartActivity(intent2);\r\n\r\n}\r\n\r\nelse{\r\nview.loadUrl(url);\r\n}\r\nreturn true;\r\n\r\n}\r\n\r\npublic Intent newEmailIntent(Context context, String address, String subject, String body, String cc) {\r\nIntent intent = new Intent(Intent.ACTION_SEND);\r\nintent.putExtra(Intent.EXTRA_EMAIL, new String[] { address });\r\nintent.putExtra(Intent.EXTRA_TEXT, body);\r\nintent.putExtra(Intent.EXTRA_SUBJECT, subject);\r\nintent.putExtra(Intent.EXTRA_CC, cc);\r\nintent.setType(\"message\/rfc822\");\r\nreturn intent;\r\n}\r\n};\r\n\r\n\u00a0\r\n\r\n\u00a0\r\n}\r\n\r\n\u00a0\r\n\r\n@Override\r\npublic boolean onCreateOptionsMenu(Menu menu) {\r\n\r\n\/\/ Inflate the menu; this adds items to the action bar if it is present.\r\ngetMenuInflater().inflate(R.menu.main, menu);\r\nreturn true;\r\n}\r\n\r\n@Override\r\npublic boolean onOptionsItemSelected(MenuItem item) {\r\n\/\/ Handle action bar item clicks here. The action bar will\r\n\/\/ automatically handle clicks on the Home\/Up button, so long\r\n\/\/ as you specify a parent activity in AndroidManifest.xml.\r\nint id = item.getItemId();\r\nif (id == R.id.action_settings) {\r\nreturn true;\r\n}\r\nreturn super.onOptionsItemSelected(item);\r\n}\r\n\r\n\/**\r\n* A placeholder fragment containing a simple view.\r\n*\/\r\npublic static class PlaceholderFragment extends Fragment {\r\n\r\npublic PlaceholderFragment() {\r\n}\r\n\r\n@Override\r\npublic View onCreateView(LayoutInflater inflater, ViewGroup container,\r\nBundle savedInstanceState) {\r\nView rootView = inflater.inflate(R.layout.fragment_main, container, false);\r\nreturn rootView;\r\n}\r\n}\r\n\r\ntarayici.setWebViewClient(mWebClient); \/\/Client Ayarlar\u0131n\u0131 Webview nesnemiz olan \"taray\u0131c\u0131\"ya at\u0131yoruz.\r\ntarayici.loadUrl(\"http:\/\/www.gncz.net\/\"); \/\/webview'\u0131n y\u00f6nlendirilece\u011fi sayfa\r\n\r\n}\r\n\r\n\u00a0\r\n<\/pre>\n<p>Evet Arkada\u015flar, MainActivity ile ilgili olarak yapacaklar\u0131m\u0131z da bu kadar.<\/p>\n<p>\u015eimdi Android Manifest dosyam\u0131za da internet permission&#8217;\u0131m\u0131z\u0131 verirsek program\u0131m\u0131z haz\u0131r olacakt\u0131r.<\/p>\n<pre class=\"lang:java decode:true\" title=\"AndroidMantifest.xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\npackage=\"pkg.gncweb\" &gt;\r\n&lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;\r\n&lt;application\r\nandroid:allowBackup=\"true\"\r\nandroid:icon=\"@drawable\/ic_launcher\"\r\nandroid:label=\"@string\/app_name\"\r\nandroid:theme=\"@style\/AppTheme\" &gt;\r\n&lt;activity\r\nandroid:name=\"pkg.gncweb.MainActivity\"\r\nandroid:label=\"@string\/app_name\" &gt;\r\n&lt;intent-filter&gt;\r\n&lt;action android:name=\"android.intent.action.MAIN\" \/&gt;\r\n\r\n&lt;category android:name=\"android.intent.category.LAUNCHER\" \/&gt;\r\n&lt;\/intent-filter&gt;\r\n&lt;\/activity&gt;\r\n&lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n\r\n\u00a0\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba Arkada\u015flar; Bu yaz\u0131m\u0131zda, android&#8217;de en \u00e7ok kullan\u0131lan nesnelerden biri olan webviewlardan bahsedece\u011fiz ve ufak bir uygulamaya giri\u015f yapaca\u011f\u0131z. Webview&#8217;lar, bir web sitesini uygulama i\u00e7erisinden \u00e7a\u011f\u0131rmak ve uygulama i\u00e7erisinde a\u00e7mak i\u00e7in kullan\u0131lan nesnelerdir. K\u0131sacas\u0131, uygulamaya ait browser da diyebiliriz. Peki neden webview kullan\u0131l\u0131r? Bu sorunun bir \u00e7ok cevab\u0131 olmakla birlikte en \u00e7ok kullan\u0131m sebebi: responsive olan web sayfalar\u0131n\u0131; sanki native<a class=\"more-link\" href=\"https:\/\/gncz.net\/index.php\/android-studio-webview-yapimi-1.html\">[Devam\u0131n\u0131 Oku&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":16651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/posts\/16610"}],"collection":[{"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/comments?post=16610"}],"version-history":[{"count":9,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/posts\/16610\/revisions"}],"predecessor-version":[{"id":16652,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/posts\/16610\/revisions\/16652"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/media\/16651"}],"wp:attachment":[{"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/media?parent=16610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/categories?post=16610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gncz.net\/index.php\/wp-json\/wp\/v2\/tags?post=16610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}