Membuat Chat Bubble Seperti di Facebook dengan CSS dan jQuery

Selamat Siang kali ini admin akan membahas Chat Bubble dengan CSS dan JQuery, langkah pertama buat dulu kerangka htmlnya seperti berikut

<!DOCTYPE html>
<
html>
<
head>
<
title>Facebook Like Chat</title>
<
link rel="stylesheet" type="text/css" href="style.css">
<
script src="jquery.js"></script>
<
script src="style.js"></script>
</head>
<
body>
<
div class="chat_box">
<
div class="chat_head">Chatbox</div>
<
div class="chat_body">
<
div class="user">Juanas Smith</div>
</div>
</div>

<
div class="msg_box" style="right: 290px">
<
div class="msg_head">Juanas Smith
<
div class="close">x</div></div>
<
div class="msg_wrap">
<
div class="msg_body">
<
div class="msg_a">This is from A</div>
<
div class="msg_b">This from B</div>
<
div class="msg_insert"></div>
</div>
<
div class="msg_footer">
<
textarea rows="2" class="msg_input" placeholder="Press Enter to send Message"></textarea>
</div>
</div>
</div>
</body>
</html>

kemudian buat style CSS nya seperti berikut

body {

       background-color: #16a085;

       margin: 0px;

       font-family: sans-serif;

       }



       .chat_box, .msg_box {

       cursor: pointer;

       position: fixed;

       bottom: 0px;

       right: 20px;

       background: white;

       width : 250px;

/*height: 400px;*/

       border-radius: 5px 5px 0px 0px;

       }



       .msg_box {

/*height: 350px;*/

       bottom: -5px;

       }



       .chat_head,.msg_head {

       background: #f39c12;

       padding: 15px;

       color: white;

       font-weight: bold;

       border-radius: 5px 5px 0px 0px;

/*position: fixed;*/

       }



       .chat_body {

       height: 400px;

       }



       .user {

       padding: 20px 25px;

       position: relative;

       cursor: pointer;

       }



       .user:hover {

       background: #f8f8f8;

       }



       .user:before {

       content: "";

       position: absolute;

       background-color: #2ecc71;

       width: 10px;

       height: 10px;

       left: 8px;

       top: 24px;

       border-radius: 50%;

       }



       .msg_head {

       background: #3498db;

       }



       .close {

       float: right;

       }



       .msg_body {

       height: 250px;

       font-size: 12px;

       overflow-y: auto;

       overflow-x: hidden;

       background: #bdc3c7;

       }



       .msg_input {

       border-color: transparent;

       border-top: 1px solid silver;

       width: 100%;

       box-sizing: border-box;

       -webkit-box-sizing: border-box;

       -moz-box-sizing: border-box;

       }



       .msg_a {

       margin-top: 10px;

       margin-right: 20px;

       min-height: 20px;

       padding: 15px;

       background: #99ffcc;

       margin-left: 20px;

       position: relative;

       border-radius: 5px;

       color: white;

       }



       .msg_a:before {

       content: "";

       position: absolute;

       width: 0px;

       height: 0px;

       top: 7px;

       left: -30px;

       border: 15px solid;

       border-color: transparent #99ffcc transparent transparent;

       }



       .msg_b {

       margin-top: 10px;

       width: auto;

       margin-right: 20px;

       min-height: 20px;

       padding: 15px;

       background: #ffff99;

       margin-left: 20px;

       position: relative;

       border-radius: 5px;

       color: black;

       }



       .msg_b:before {

       content: "";

       position: absolute;

       width: 0px;

       height: 0px;

       top: 7px;

       right: -30px;

       border: 15px solid;

       border-color: transparent transparent transparent #ffff99;

       }

kemudian buat style javascriptnya, untuk javascriptnya ini memerlukan jquery, silakan anda download dulu jquery dari website resminya. untuk javascriptnya seperti berikut

$(document).ready(function() {

    $('.chat_head').click(function(){

    $('.chat_body').slideToggle('slow');

    // $('.user').slideToggle('slow');

    });



    $('.msg_head').click(function(){

    $('.msg_wrap').slideToggle('slow');

    // $('.msg_box').slideToggle('slow');

    });



    $(".close").click(function(){

    $('.msg_box').hide();

    });



    $(".user").click(function(){

    $('.msg_wrap').show();

    $('.msg_box').show();

    });



    $('textarea').keypress(function(e){

    if(e.keyCode == 13) {

    var msg = $(this).val();

    $(this).val('');

    $("<div class='msg_b'>"+msg+"</div>").insertBefore('.msg_insert');

    $('.msg_body').scrollTop($('.msg_body')[0].scrollHeight);

    }

    });

});





langkah terakhir silakan test hasilnya di browser jika tampilanya seperti gambar di atas maka anda telah berhasil, ok sekian dulu tutorial kali ini, jika ada yang ditanyakan silakan tulis pada kolom komentar di bawah. jika artikel ini bermanfaat silakan bagikan ke teman anda.

Sekali dayung tiga pulau terlampaui


Bagi anda yang berfropesi sebagai Freelancer programmer ada baiknya jika sedang menulis kode program, anda rekam untuk di upload ke youtube, kemudian anda bikin dokumentasi untuk di blog. jadi ketika anda selesai menulis kode program anda akan mendapatkan tiga hasil sekaligus yang pertama aplikasi anda itu sendiri, yang kedua video untuk di upload ke youtube dan yang ketiga adalah tulisan untuk di posting ke blog.

ketika tulisan atau video anda sudah banyak anda tinggal memonetisasinya dengan mendaftar adsense untuk blog dan youtube dan jika aplikasi yang anda buat berbasis android maka anda juga bisa mendaftar admob. jadi anda akan mendapatkan tiga keuntungan yang pertama dari adsense untuk blog yang kedua dari adsense untuk youtube dan yang ketiga admob untuk aplikasi anda.


ketika ilkan anda udah banyak anda tinggal bersantai karena tiap saat uang akan mengalir ke rekening anda, kemanapun anda pergi uang akan menghampiri anda. oke sampai disini dulu postingan kali ini semoga bermanfaat. jika menurut anda artikel ini bermanfaat silakan bagikan artikel ini ke teman anda. terimakasih sudah berkunjung ke blog ini

Cara membuat program untuk Mengetahui jumlah Pengunjung situs kita dengan PHP


Iya pada kesempatan kali ini kita akan membuat program untuk mengetahui jumlah pengunjung situs kita dengan PHP, cocok sekali untuk mengetahui berapa pengunjung ke situs kita. maka dengan script ini anda bisa mengetahui berapakah pengunjung situs kita perbulanya / sudah dikunjungi berapa orang situs tersebut  dari mulai mengudara. tapi kelemahannya setiap kali kita melakukan refresh halaman maka program ini akan menganggapnya pengunjung baru. jadi setiap kita refresh hitungan akan bertambah.

ini scriptnya:

<?php
$counter_file="counter.txt";
if (!file_exists ($counter_file)) {
fopen ($counter_file, "w");
}
$file = fopen($counter_file, "r");

$counter = fread($file, 10);
fclose($file);

$counter++;

echo "<h2>Anda adalah pengunjung ke - $counter</h2>";
$file = fopen($counter_file, "w");
fwrite($file, $counter);
fclose($file);
?>

kemudian buat file baru bernama counter.txt isinya dikosongkan saja.

Nah ketika halaman di refresh PHP akan menulis ke file couter.txt kemudian isi tulisan tersebut akan ditampilkan seperti pada gambar diatas.

Macam - macam Perulangan di PHP

1
Jika kita mau menampilkan data yang berulang-ulang kita bisa menggunakan perulangan, perulangan yang ada
ddii php ada for, foreach, while, do while. Berikut ini adalah Macam-macam perulangan di PH beserta contohnya

  1. .       Struktur Perulangan For


for (init_awal, kondisi, counter) {
 statement-yang-diulang;
}
Keterangan :
ƒ  init_awal merupakan inisialisasi atau nilai awal variable.
ƒ  kondisi merupakan statemen kondisi yang akan membatasi perulangan.
ƒ  counter merupakan pertambahan atau pengurangan nilai variabel
sehingga perulangan tetap berjalan.

  1. 2.       Struktur Perulangan While


init_awal;
while (kondisi) {
 statement-yang-diulang;
 counter;
}
Keterangan :
ƒ  init_awal merupakan inisialisasi atau nilai awal variable.
ƒ  kondisi merupakan statemen kondisi yang akan membatasi perulangan.
ƒ  counter merupakan pertambahan atau pengurangan nilai variabel
sehingga perulangan tetap berjalan.

  1. 3.       Struktur Perulangan Do ... while


init_awal;
do {
 statement-yang-diulang;
 counter;
} while (kondisi);
Keterangan :
ƒ  init_awal merupakan inisialisasi atau nilai awal variable.
ƒ  kondisi merupakan statemen kondisi yang akan membatasi perulangan.
ƒ  counter merupakan pertambahan atau pengurangan nilai variabel
sehingga perulangan tetap berjalan.
ƒ  Pada struktur do...while, pemeriksaan kondisi ada di bawah, sehingga
statement yang berada dalam block do...while setidaknya akan dieksekusi
sebanyak satu kali.

  1. 4.       Struktur Perulangan Foreach


foreach (array_expression as $value)
   statement;

foreach (array_expression as $key => $value)
   statement;
Keterangan :
ƒ  Struktur foreach biasanya digunakan untuk melakukan perulangan
berdasarkan isi suatu array. Perulangan akan berakhir jika isi array telah
habis.

Nama File  : for.php
Deskripsi  : Program Struktur Perulangan For dan beberapa variasinya.

<?php
/* contoh 1 */
for ($i = 1; $i <= 10; $i++) {
   echo "$i ";
}
echo "<br><br>";
/* contoh 2 */
for ($i = 1; ; $i++) {
   if ($i > 10) {
       break;
   }
   echo "$i ";
}
echo "<br><br>";
/* contoh 3 */
$i = 1;
for (; ; ) {
   if ($i > 10) {
       break;
   }
   echo "$i ";
   $i++;
} echo "<br><br>";
/* contoh 4 */
for ($i = 1; $i <= 10; print "$i ", $i++);
?>

Program di atas merupakan bentuk-bentuk perulangan dengan menggunakan for.
Contoh yang pertama (baris 4-6) merupakan bentuk yang paling umum. Pada
contoh 2, batas akhir perulangan tidak disebutkan dalam for, tapi diatur dengan if
dan break (baris 11-13). 


Nama File  : while.php
Deskripsi  : Program Struktur Perulangan While dan beberapa variasinya.

<?php
/* contoh 1 */
$i = 1;
while ($i <= 10) {
   echo $i++; 
}
echo "<br><br>";

/* contoh 2 */
$i = 1;
while ($i <= 10):
   echo "$i";
   $i++;
endwhile;
echo "<br><br>";

/* contoh 3 */
$i = 1;
while ($i <= 6) {
   echo "<h$i>Heading $i</h$i>";
   $i++;
}
?>

Program di atas merupakan beberapa variasi perulangan dengan while. Contoh
yang pertama (baris 3-6) merupakan bentuk yang paling umum dipakai. Blok
perintah (baris 5) akan dijalankan selama pemeriksaan kondisi pada baris ke-4
bernilai TRUE. Contoh kedua merupakan bentuk lain dari while, bentuk ini jarang
digunakan. Pada contoh ketiga, penggunaan perulangan untuk menampilkan
tulisan dengan format <H1> sampai <H6>


Nama File  : dowhile.php
Deskripsi  : Program Struktur Perulangan dengan Do...While.
<?php

$i = 1;
do {
 echo "$i ";
 $i+=2;
} while ($i <= 20);

?>


Program di atas akan menampilkan bilangan ganjil antara 1 sampai 20
menggunakan struktur perulangan  do..while. Pada struktur perulangan

do...while, pemeriksaan kondisi berada di bawah. 

Membuat Aplikasi Portal Berita dengan RestfulApi

Selamat Malam kali ini kita akan membuat aplikasi portal berita berbasis Android dengan menggunakan RestfulApi dan database MySQL
Pertama tambahkan beberapa despendecies berikut:
implementation 'com.squareup.retrofit2:retrofit:2.3.0'implementation 'com.squareup.retrofit2:converter-gson:2.3.0'implementation 'com.squareup.picasso:picasso:2.5.2'implementation 'com.android.support:recyclerview-v7:26.1.0'

Kemudian tambahkan permission internet pada Android Manifest
<uses-permission android:name="android.permission.INTERNET"/>

Untuk API nya saya sudah menguploadnya pada web hosting bisa diakses di http://giviews.000webhostapp.com/berita/tampil_berita.php 

Sekarang buat dua buah package pada folder java, yaitu package network dan response
susunan package file java

Buat sebuah interface ApiService.java pada package network lalu masukan kode berikut:
import com.khilman.www.aplikasiportalberita.response.ResponseBerita;

import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiServices {

    //@TIPEMETHOD("API_END_POINT")    @GET("tampil_berita.php")
    Call request_show_all_berita();
    //  nama_method()
}



Sekarang buat class InitRetrofit.java pada package network dan masukan kode berikut:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class InitRetrofit {
    // URL Server API    public static String API_URL = "http://giviews.000webhostapp.com/berita/";

    public static Retrofit setInit() {
        return new Retrofit.Builder().baseUrl(API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static ApiServices getInstance() {
        return setInit().create(ApiServices.class);
    }
}

Selanjutnya buat class BeritaItem.java pada package response dan tambahkan kode berikut: 
import com.google.gson.annotations.SerializedName;

public class BeritaItem{

   @SerializedName("penulis")
   private String penulis;

   @SerializedName("foto")
   private String foto;

   @SerializedName("id")
   private String id;

   @SerializedName("judul_berita")
   private String judulBerita;

   @SerializedName("tanggal_posting")
   private String tanggalPosting;

   @SerializedName("isi_berita")
   private String isiBerita;

   public void setPenulis(String penulis){
      this.penulis = penulis;
   }

   public String getPenulis(){
      return penulis;
   }

   public void setFoto(String foto){
      this.foto = foto;
   }

   public String getFoto(){
      return foto;
   }

   public void setId(String id){
      this.id = id;
   }

   public String getId(){
      return id;
   }

   public void setJudulBerita(String judulBerita){
      this.judulBerita = judulBerita;
   }

   public String getJudulBerita(){
      return judulBerita;
   }

   public void setTanggalPosting(String tanggalPosting){
      this.tanggalPosting = tanggalPosting;
   }

   public String getTanggalPosting(){
      return tanggalPosting;
   }

   public void setIsiBerita(String isiBerita){
      this.isiBerita = isiBerita;
   }

   public String getIsiBerita(){
      return isiBerita;
   }

   @Override   public String toString(){
      return          "BeritaItem{" + 
         "penulis = '" + penulis + '\'' + 
         ",foto = '" + foto + '\'' + 
         ",id = '" + id + '\'' + 
         ",judul_berita = '" + judulBerita + '\'' + 
         ",tanggal_posting = '" + tanggalPosting + '\'' + 
         ",isi_berita = '" + isiBerita + '\'' + 
         "}";
      }
}

Berikutnya buatlah class ResponseBerita.java pada package response dan masukan kode berikut: 
import java.util.List;
import com.google.gson.annotations.SerializedName;

public class ResponseBerita{

   @SerializedName("berita")
   private List berita;

   @SerializedName("status")
   private boolean status;

   public void setBerita(List berita){
      this.berita = berita;
   }

   public List getBerita(){
      return berita;
   }

   public void setStatus(boolean status){
      this.status = status;
   }

   public boolean isStatus(){
      return status;
   }

   @Override   public String toString(){
      return          "ResponseBerita{" + 
         "berita = '" + berita + '\'' + 
         ",status = '" + status + '\'' + 
         "}";
      }
}

Lalu buat Class AdapterBerita.java pada dan masukan kode berikut:
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.khilman.www.aplikasiportalberita.response.BeritaItem;
import com.squareup.picasso.Picasso;

import java.util.List;

class AdapterBerita extends RecyclerView.Adapter {
    // Buat Global variable untuk manampung context    Context context;
    List berita;
    public AdapterBerita(Context context, List data_berita) {
        // Inisialisasi        this.context = context;
        this.berita = data_berita;
    }

    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Layout inflater        View view = LayoutInflater.from(context).inflate(R.layout.berita_item, parent, false);

        // Hubungkan dengan MyViewHolder        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override    public void onBindViewHolder(MyViewHolder holder, final int position) {
        // Set widget        holder.tvJudul.setText(berita.get(position).getJudulBerita());
        holder.tvTglTerbit.setText(berita.get(position).getTanggalPosting());

        // Dapatkan url gambar        final String urlGambarBerita = "http://giviews.000webhostapp.com/berita/images/" + berita.get(position).getFoto();
        // Set image ke widget dengna menggunakan Library Piccasso        // krena imagenya dari internet        Picasso.with(context).load(urlGambarBerita).into(holder.ivGambarBerita);

        // Event klik ketika item list nya di klik        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                // Mulai activity Detail                Intent varIntent = new Intent(context, DetailActivity.class);
                // sisipkan data ke intent                varIntent.putExtra("JDL_BERITA", berita.get(position).getJudulBerita());
                varIntent.putExtra("TGL_BERITA", berita.get(position).getTanggalPosting());
                varIntent.putExtra("PNS_BERITA", berita.get(position).getPenulis());
                varIntent.putExtra("FTO_BERITA", urlGambarBerita);
                varIntent.putExtra("ISI_BERITA", berita.get(position).getIsiBerita());

                // method startActivity cma bisa di pake di activity/fragment                // jadi harus masuk ke context dulu                context.startActivity(varIntent);
            }
        });
    }
    // Menentukan Jumlah item yang tampil    @Override    public int getItemCount() {
        return berita.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        // Deklarasi widget        ImageView ivGambarBerita;
        TextView tvJudul, tvTglTerbit, tvPenulis;
        public MyViewHolder(View itemView) {
            super(itemView);
            // inisialisasi widget            ivGambarBerita = (ImageView) itemView.findViewById(R.id.ivPosterBerita);
            tvJudul = (TextView) itemView.findViewById(R.id.tvJudulBerita);
            tvTglTerbit = (TextView) itemView.findViewById(R.id.tvTglTerbit);
            tvPenulis = (TextView) itemView.findViewById(R.id.tvPenulis);
        }
    }
}

Kemudian buat class DetailActivity.java dan tambahkan kode berikut:
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

public class DetailActivity extends AppCompatActivity {

    // Deklarasi    ImageView ivGambarBerita;
    TextView tvTglTerbit, tvPenulis;
    WebView wvKontenBerita;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // Inisialisasi        ivGambarBerita = (ImageView) findViewById(R.id.ivGambarBerita);
        tvTglTerbit = (TextView) findViewById(R.id.tvTglTerbit);
        tvPenulis = (TextView) findViewById(R.id.tvPenulis);
        wvKontenBerita = (WebView) findViewById(R.id.wvKontenBerita);

        // Jalankan method tampil detail berita        showDetailBerita();

    }

    private void showDetailBerita() {
        // Tangkap data dari intent        String judul_berita = getIntent().getStringExtra("JDL_BERITA");
        String tanggal_berita = getIntent().getStringExtra("TGL_BERITA");
        String penulis_berita = getIntent().getStringExtra("PNS_BERITA");
        String isi_berita = getIntent().getStringExtra("ISI_BERITA");
        String foto_berita = getIntent().getStringExtra("FTO_BERITA");

        // Set judul actionbar / toolbar        getSupportActionBar().setTitle(judul_berita);

        // Set ke widget        tvPenulis.setText("Oleh : " + penulis_berita);
        tvTglTerbit.setText(tanggal_berita);
        // Untuk gambar berita        Picasso.with(this).load(foto_berita).into(ivGambarBerita);
        // Set isi berita sebagai html ke WebView        wvKontenBerita.getSettings().setJavaScriptEnabled(true);
        wvKontenBerita.loadData(isi_berita, "text/html; charset=utf-8", "UTF-8");
    }
} 

Kemudian buat Class MainActivity.java dan tambahkan kode berikut:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.khilman.www.aplikasiportalberita.network.ApiServices;
import com.khilman.www.aplikasiportalberita.network.InitRetrofit;
import com.khilman.www.aplikasiportalberita.response.BeritaItem;
import com.khilman.www.aplikasiportalberita.response.ResponseBerita;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    // Deklarasi Widget    private RecyclerView recyclerView;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Inisialisasi Widget        recyclerView = (RecyclerView) findViewById(R.id.rvListBerita);
        // RecyclerView harus pakai Layout manager        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        // Eksekusi method        tampilBerita();
    }

    private void tampilBerita() {
        ApiServices api = InitRetrofit.getInstance();
        // Siapkan request        Call beritaCall = api.request_show_all_berita();
        // Kirim request        beritaCall.enqueue(new Callback() {
            @Override            public void onResponse(Call call, Response response) {
                // Pasikan response Sukses                if (response.isSuccessful()){
                    Log.d("response api", response.body().toString());
                    // tampung data response body ke variable                    List data_berita = response.body().getBerita();
                    boolean status = response.body().isStatus();
                    // Kalau response status nya = true                    if (status){
                        // Buat Adapter untuk recycler view                        AdapterBerita adapter = new AdapterBerita(MainActivity.this, data_berita);
                        recyclerView.setAdapter(adapter);
                    } else {
                        // kalau tidak true                        Toast.makeText(MainActivity.this, "Tidak ada berita untuk saat ini", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override            public void onFailure(Call call, Throwable t) {
                // print ke log jika Error                t.printStackTrace();
            }
        });
    }
}

Selanjutnya buat layout berita_item.xml kemudian masukan kode berikut:
xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:paddingVertical="5dp">
    <ImageView        android:id="@+id/ivPosterBerita"        android:layout_width="match_parent"        android:layout_height="130dp"        android:layout_marginHorizontal="10dp"        android:scaleType="fitXY"        android:src="@mipmap/ic_launcher"/>
    <TextView        android:id="@+id/tvJudulBerita"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="18sp"        android:layout_marginVertical="10dp"        android:layout_marginHorizontal="10dp"        android:textColor="@android:color/black"        android:text="Judul Artikel Berita"/>
    <LinearLayout        android:layout_marginHorizontal="10dp"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">
        <TextView            android:id="@+id/tvTglTerbit"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="Sabtu, 12 Maret 2018."/>
        <TextView            android:id="@+id/tvPenulis"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginHorizontal="10dp"            android:text="Oleh : Rizal Hilman"/>
    </LinearLayout>
</LinearLayout>

Selanjutnya buat layout content_detail.xml dan tambahkan kode berikut: 
xml version="1.0" encoding="utf-8"?><android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context=".DetailActivity"    tools:showIn="@layout/activity_detail">


    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:padding="10dp"        android:orientation="vertical">
        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginBottom="15dp"            android:orientation="horizontal">
            <TextView                android:id="@+id/tvTglTerbit"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="Senin, 12 Maret 2018"/>
            <TextView                android:id="@+id/tvPenulis"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginHorizontal="10dp"                android:text="Oleh : Rizal Hilman"/>
        </LinearLayout>
        <WebView            android:layout_width="match_parent"            android:layout_height="match_parent"            android:id="@+id/wvKontenBerita"></WebView>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

Berikutnya buat layout activity_main.xml dan masukan kode berikut: 
xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity">
    <android.support.v7.widget.RecyclerView        android:id="@+id/rvListBerita"        android:layout_width="match_parent"        android:layout_height="match_parent" />
</LinearLayout>

Terakhir buat layout activity_detail.xml dan masukan kode berikut:
xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:fitsSystemWindows="true"    tools:context="com.khilman.www.aplikasiportalberita.DetailActivity">

    <android.support.design.widget.AppBarLayout        android:id="@+id/app_bar"        android:layout_width="match_parent"        android:layout_height="@dimen/app_bar_height"        android:fitsSystemWindows="true"        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout            android:id="@+id/toolbar_layout"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:fitsSystemWindows="true"            app:contentScrim="?attr/colorPrimary"            app:layout_scrollFlags="scroll|exitUntilCollapsed"            app:toolbarId="@+id/toolbar">
            
            <ImageView                android:id="@+id/ivGambarBerita"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:src="@mipmap/ic_launcher"                android:scaleType="fitXY"/>

            <android.support.v7.widget.Toolbar                android:id="@+id/toolbar"                android:layout_width="match_parent"                android:layout_height="?attr/actionBarSize"                app:layout_collapseMode="pin"                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_detail" />

    <android.support.design.widget.FloatingActionButton        android:id="@+id/fab"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="@dimen/fab_margin"        app:layout_anchor="@id/app_bar"        app:layout_anchorGravity="bottom|end"        app:srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

 
Sekarang coba jalankan aplikasi anda jika ada yang kurang jelas silakan ditanyakan pada kolom komentar dibawah, terimakasih sudah berkunjung ke blog kami semoga tutorial ini bermanfaat

sumber: https://medium.com/@rizal_hilman/aplikasi-portal-berita-android-dengan-php-mysqli-belajarapi-ccde39565403