Wednesday, October 4, 2017

Đọc thơ Nhật cổ (2)

Ta muốn phần đọc thơ có thể vuốt sang bài mới, người dùng chọn bài nào chuyển sang xong cứ vuốt là đến bài tiếp theo.
Ví dụ người dùng chọn bài 5, đọc xong vuốt sang bài 6, 7, 8 rồi lại quay về bài 1. Tức là không cần thoát về màn hình trước, cứ vuốt ngang là ra hết các bài.
Ta sẽ dùng ViewParge để làm.
File xml của class đọc lúc này như sau.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageSwitcher
        android:id="@+id/ImageSwitcher01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerInParent="true"
        android:background="@drawable/nen" >
    </ImageSwitcher>
  
    <LinearLayout
        android:id="@+id/l"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         android:layout_marginTop="80dp"      
        android:orientation="horizontal" >
    </LinearLayout>
</RelativeLayout>
Không có textView nào vì ta sẽ vẽ ra textView trong code.
Thêm vào đầu class đọc đoạn sau.
implements ViewPager.OnPageChangeListener
Ta đã có sẵn 3 mảng ten, tacgia, mang, hãy thêm các đoạn sau vào khai báo bên trên Override.
static String[] ten2 = new String[8];
static String[] tacgia2 = new String[8];
static String[] ar = new String[8];
static String[] ar2 = new String[8]; 
private ViewPager mViewPager;
static LinearLayout l;

Bên dưới dòng giữ cho màn hình luôn bật, ta sửa thành.
l = (LinearLayout) findViewById(R.id.l);       
mViewPager = new ViewPager(this);       
mViewPager.setLayoutParams(new ListView.LayoutParams(
                ListView.LayoutParams.MATCH_PARENT,500));      
   mViewPager.setOnPageChangeListener(this);     
   mViewPager.setAdapter(new HeaderAdapter(this));     
   l.addView(mViewPager);
    Intent in = getIntent();
    Bundle bun = in.getExtras();     
    int vitri = bun.getInt("gi");
    String tenbai = bun.getString("gi2");
Đó là ta khai báo viewParge, nhét nó vào LinearLayout, dùng Intent lấy vị trí bài đọc chuyển sang.

Bây giờ ta sẽ đọc các bài thơ thành chuỗi rồi cho vào mảng ar.
for (int i = 0; i < mang.length; i++) {   
          InputStream inp = this.getResources().openRawResource((Integer) mang[i]);
          try
            {     
              byte[] buffer = new byte[inp.available()];
                while (inp.read(buffer) != -1);
                String jsontext = new String(buffer);                
              ar[i]=jsontext;
            }
            catch (IOException ke)
            {
              //return null;
            }
            }     
Ta dùng vòng lặp để đọc luôn từ bài đầu đến hết, cho vào mảng chuỗi.
Bây giờ có một vấn đề là ta phải đảo mảng, cho vị trí bài thơ được chọn đọc lên đầu, các vị trí sau cứ thế tiếp tục, đến hết bài thứ 8 lại quay về đầu tiên bài 1.
Mục đích để khi cho vào ViewParge, người dùng vuốt sang thì các bài cứ thế theo nhau hiện ra.
for (int i = 0; i < 8; i++) {
 int so=vitri+i;
   if(so>7){
    so=so-8;
   }
  ten2[i]=ten[so];     
  tacgia2[i]=tacgia[so];    
  ar2[i]=ar[so];
    }
Vị trí bài chọn sẽ lên đầu trong các mảng có số 2, tiếp theo cứ thế nối đuôi vào.

Bây giờ copy đoạn sau xuống trên cái ngoặc đóng cuối cùng.
@Override
    public void onPageScrolled(int position,
            float positionOffset, int positionOffsetPixels) { }
    @Override
    public void onPageSelected(int position) { }
    @Override
    public void onPageScrollStateChanged(int state) {      
        boolean isScrolling =
                state != ViewPager.SCROLL_STATE_IDLE;        //ListView.requestDisallowInterceptTouchEvent(isScrolling);
    }
     private static class HeaderAdapter extends PagerAdapter {
        private Context mContext;
        public HeaderAdapter(Context context) {
          mContext = context;
        }       
    @Override
    public int getCount() {
        return 8;
    }    
     @Override
    public Object instantiateItem(ViewGroup container,int position) {             
    LinearLayout l = new LinearLayout(mContext);
    l.setOrientation(LinearLayout.VERTICAL);       
    TextView t = new TextView(mContext);
        TextView t2 = new TextView(mContext);
        TextView t3 = new TextView(mContext);      
        t.setGravity(Gravity.CENTER);
        t2.setGravity(Gravity.CENTER);
        t3.setGravity(Gravity.CENTER);
       
 t.setTextColor(Color.parseColor("#800000"));
 t.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
 t.setHeight(48);

 t2.setTextColor(Color.BLACK);
 t2.setTypeface(Typeface.createFromAsset(mContext.getAssets(), "Roboto-Italic.ttf"));
 t3.setTextColor(Color.BLUE);
 t.setTextSize(20);
 t2.setTextSize(18);
 t3.setTextSize(20);

 t.setText(ten2[position]);
 t2.setText(ar2[position]);
 t3.setText(tacgia2[position]);

LayoutParams pa = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);    

 l.addView(t, pa);
 l.addView(t2, pa);
 l.addView(t3, pa);
   container.addView(l);    
    return l;
    }
   @Override
    public void destroyItem(ViewGroup container,int position, Object object) {
        View page = (View) object;
        container.removeView(page);
    }
    @Override
    public boolean isViewFromObject(View view,Object object) {
        return (view == object);
    }
 }  
Đoạn code này.
@Override
    public int getCount() {
        return 8;
    }    
Số 8 là kích thước mảng, nếu thay đổi số bài thơ thì cũng thay đổi số 8 này.
Chú ý phần vẽ ra 3 textView, dùng nó để hiển thị tên bài, nội dung, tên tác giả.
Đoạn bên dưới ta set vị trí, tô màu, chọn font, set chữ cho các textView.
Bây giờ chạy thử, bạn sẽ thấy class đọc có thể vuốt sang bài tiếp theo.

Thử xóa chữ static nào đó trên đầu xem sao, Eclipse, Android Studio sẽ báo lỗi và bảo bạn phải thêm vào. Nó có nghĩa là biến tĩnh, nhưng nếu ta không biết, quên không cho vào thì sẽ được nhắc như vậy nên thực tế ta không cần biết nó là gì.

Cứ thực hành mà không cần nhìn đến nó.

No comments:

Post a Comment