LOADING . . .

Membuat Detail Activity dan Kesimpulan



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.  

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.

Screen Shot 2021-03-14 at 00.35.31

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.





I’d love to hear from you, leave a Reply!