Table of contents
Membuat Detail Activity dan Kesimpulan - Pada artikel sebelumnya, sedikit saya jelaskan penggunaan Inten pada Post Adapter. Ketika salah satu artikel Loop di-klik maka akan diarahkan ke sebuah activity baru dengan nama DetailActivty. Maka, pada artikel ini akan membahas tentang DetailActivity tersebut. Bagi anda yang baru mengikuti seri Membuat Website Portal Berita Dengan Blogger.com, silahkan dibaca terlebih dahulu langkah-langkah membuat website portal berita di blogspot hingga implementasi blogger API v3 ke dalam Java Android Studio.
- Part 1: Membuat Website Portal Berita Dengan Blogger.com
- Part 2: Pengaturan Custom Domain pada Blogger.com
- Part 3: Mengganti Template (Tema) di Blogger.com
- Part 4: Membuat page, post dan label di Blogger.com
- Part 5: Customize Tema (Template) Blogger.com
- Part 6: Pengenalan dan Setup Blogger API v3
- Part 7: Membuat Project, Library dan Package Android Studio
- Part 8: Pengaturan Android Manifest dan Membuat Splash Activity
- Part 9: Membuat Main Activity dan Loop Blogspot Post dengan Android Studio
Detail Activity XML
Buka project android studio anda, klik folder res >> layout >> klik kanan pada folder layout >> New >> Layout Resource File kemudian beri nama activity_detail.xml
Copy baris kode xml dibawa, paste dan simpan
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#fff"
tools:context=".DetailActivity">
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:id="@+id/titleTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textColor="#000"
android:textSize="20dp"
android:textStyle="bold"/>
<TextView
android:id="@+id/contentDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/titleTv"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="20dp"
android:text="Load Content..."
android:textAppearance="@android:style/TextAppearance" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
Detail Activity Java
Masuk ke bagian logika program/aplikasi, masuk ke folder blogger dan buat sebuah file Java dengan nama DetailActivity.java Copy java code dibawah, paste pada DetailActivity.java dan simpan
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LevelListDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.teknologi.api.Api;
import org.json.JSONObject;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class DetailActivity extends AppCompatActivity implements Html.ImageGetter{
WebView webView;
private String postId;
private TextView titleTv, contentDescription;
private ActionBar actionBar;
private static final String TAG = "POST_DETAILS_TAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
actionBar = getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
titleTv = findViewById(R.id.titleTv);
contentDescription = findViewById(R.id.contentDesc);
contentDescription.setMovementMethod(LinkMovementMethod.getInstance());
postId = getIntent().getStringExtra("postId");
loadPostDetails();
}
private void loadPostDetails() {
String url = "https://www.googleapis.com/blogger/v3/blogs/"+ Api.blog_id +"/posts/"+ postId +"?key="+ Api.key;
Log.d(TAG, "loadPostDetails: URL"+url);
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "onResponse: "+response);
try{
JSONObject jsonObject = new JSONObject(response);
String title = jsonObject.getString("title");
String content = jsonObject.getString("content");
String url = jsonObject.getString("url");
titleTv.setText(title);
Spanned spanned = Html.fromHtml(content, DetailActivity.this, null);
contentDescription.setText(spanned);
}catch (Exception e){
Log.d(TAG, "onResponse: "+e.getMessage());
Toast.makeText(DetailActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(DetailActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return super.onSupportNavigateUp();
}
@Override
public Drawable getDrawable(String source) {
LevelListDrawable d = new LevelListDrawable();
Drawable empty = getResources().getDrawable(R.drawable.ic_baseline_image_24);
d.addLevel(0, 0, empty);
d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());
new LoadImage().execute(source, d);
return d;
}
class LoadImage extends AsyncTask<Object, Void, Bitmap> {
private LevelListDrawable mDrawable;
@Override
protected Bitmap doInBackground(Object... params) {
String source = (String) params[0];
mDrawable = (LevelListDrawable) params[1];
Log.d(TAG, "doInBackground " + source);
try {
InputStream is = new URL(source).openStream();
return BitmapFactory.decodeStream(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
Log.d(TAG, "onPostExecute drawable " + mDrawable);
Log.d(TAG, "onPostExecute bitmap " + bitmap);
if (bitmap != null) {
BitmapDrawable d = new BitmapDrawable(bitmap);
mDrawable.addLevel(1, 1, d);
mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
mDrawable.setLevel(1);
CharSequence t = contentDescription.getText();
contentDescription.setText(t);
}
}
}
}
Sedikit penjelasan dari baris kode diatas dari "menangkap" value postID yang dikirimkan oleh Post Adapter (dengan menggunakan Intent tadi) yang kemudian menggunakan volley untuk mengkonversi Blogger API v3 JSON berdasarkan postID artikel (loadPostDetails()).
postId = getIntent().getStringExtra("postId");
Styles XML
Lengkapi code dengan meng-edit file styles.xml yang berada di folder values
Copy baris kode xml dibawa, paste dan simpan
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!-- Splash application theme. -->
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">#333</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
Run aplikasi anda, dan lihat penampakan detail artikel pada aplikasi anda.
Kesimpulan
Dengan menggunakan blogger API v3 ini secara default hanya akan menampilkan 10 artikel terbaru. Jika ingin menampilkan post lebih dari 10 artikel di aplikasi android studio yang anda buat, anda harus menggunakan nextPageToken value pada pemanggilan API blogger. Jadi jika anda ingin membuat website berita berbasis blogger.com yang ingin anda buatkan sebuah aplikasi android, silahkan hubungi saya langsung via email atau whatsapp.
Silahkan download source code project Aplikasi Berita Blogger.com dengan Android Studio ini pada Github saya disini.