1. 程式人生 > >小專案口袋新聞主介面實現之MainActivity

小專案口袋新聞主介面實現之MainActivity

首先看一下介面效果圖,MainActivity就是使用ViewPager實現新聞、精選和設定三個頁面的。
這裡寫圖片描述

以下展開來看一下,首先看一下佈局檔案:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
android:orientation="vertical" > <com.wesley.todaynews.view.NoScrollViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/rg_group"
android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#a000" android:gravity="center_vertical" android:orientation="horizontal" > <RadioButton android:id="@+id/rb_news" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/news_radio_selector" android:gravity="center" android:padding="1dp" android:text="新聞" android:textColor="@drawable/text_color_selector" android:textSize="13sp" /> <RadioButton android:id="@+id/rb_photos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawableTop="@drawable/photos_radio_selector" android:gravity="center" android:padding="1dp" android:text="精選" android:textColor="@drawable/text_color_selector" android:textSize="13sp" /> <RadioButton android:id="@+id/rb_settings" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:button="@null" android:drawablePadding="1dp" android:drawableTop="@drawable/settings_radio_selector" android:gravity="center" android:padding="1dp" android:text="設定" android:textColor="@drawable/text_color_selector" android:textSize="13sp" /> </RadioGroup> </LinearLayout>

一目瞭然的佈局檔案,線性佈局裡面包含了一個ViewPager和一個RadioGroup(三個RadioButton可以自由切換),這個ViewPager的唯一不同點是進行了一個簡單的自定義,實現了禁止主介面的ViewPager的左右滑動切換效果(這樣是為了後面新聞介面的ViewPager進行左右滑動切換tab)。
來看一下自定義的ViewPager的主要程式碼:

    // 表示事件是否攔截,返回false表示不攔截,可以讓巢狀在內部的ViewPager響應左右划動事件
    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        return false;
    }

可以看到onInterceptTouchEvent方法裡面返回false,這是代表不對事件進行攔截,因為onInterceptTouchEvent是控制事件自Root 到 Child的傳遞,在這裡也就是可以讓子view(新聞頁面中的ViewPager)接收到滑動事件進行相應的處理。

接下來看一下MainActivity中的程式碼:
首先是在initView()中找到對應控制元件的id

private void initView() {
        rgGroup = (RadioGroup) findViewById(R.id.rg_group);
        vpContent = (ViewPager) findViewById(R.id.vp_content);
    }

然後在initData()方法中,進行RadioGroup的處理和ViewPager的資料初始化

rgGroup.check(R.id.rb_news);// 預設勾選首頁
// 初始化3個子頁面
mPagerList = new ArrayList<BasePager>();

mPagerList.add(new NewsPager(this));
mPagerList.add(new PhotosPager(this));
mPagerList.add(new SettingPager(this));

vpContent.setAdapter(new ContentAdapter());

rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                case R.id.rb_news:
                    vpContent.setCurrentItem(0, false);
                    break;
                case R.id.rb_photos:
                    vpContent.setCurrentItem(1, false);
                    break;
                case R.id.rb_settings:
                    vpContent.setCurrentItem(2, false);
                    break;

                default:
                    break;
                }
            }
        });

這裡的BasePager是新聞、精選和設定三個頁面的基類,主要的作用是根據不同的子頁面(新聞、精選和設定)進行不同的處理,包括返回不同的佈局,進行不同資料的處理,這裡會在接下來的新聞子頁面進行展示,這裡略過。同時監聽RadioGroup的check事件,根據不同的選擇設定ViewPager相應的展示頁面。
vpContent.setCurrentItem(0, false);其中第二個引數的false表示切換頁面的時候取消動畫,預設的ViewPager切換的時候會有一個滑動的動畫,這裡直接去掉。

接下來就是ViewPager的介面卡程式碼

    /**
     * 內容ViewPager的介面卡
     * 
     * @author zhangbingwei
     * 
     */
    class ContentAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return mPagerList.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public Object instantiateItem(View container, int position) {
            BasePager pager = mPagerList.get(position);
            ((ViewGroup) container).addView(pager.mRootView);
            pager.initData();// 初始化資料,預載入下一個頁面
            return pager.mRootView;
        }

        @Override
        public void destroyItem(View container, int position, Object object) {
            ((ViewPager) container).removeView((View) object);
        }
    }

預設的就是實現這四個方法,相信大家都很熟悉了(掌握ViewPager的前提),這裡要提一下的就是instantiateItem這個方法,原理就是通過ViewPager當前所在頁面的位置獲取對應的子頁面(新聞、精選和設定三個),然後根據對應的子頁面新增檢視到ViewPager容器中,並且初始化相應頁面的資料,也就是

pager.initData();// 初始化資料,預載入下一個頁面

這行程式碼的作用。其中mRootView是基類中定義的View,他是根據不同的子頁面來返回不同的View。例如當我們切換到新聞頁面的時候,他會展示新聞列表,切換到精選頁面的時候,會展示圖片流。這些都是有mRootView進行返回的,這些會在接下來的子頁面中進行展示。

到這裡MainActivity基本完了,不過我這裡還做了一些額外的設定,例如雙擊返回按鈕退出,從其他子頁面返回到新聞頁面的時候,新聞頁面的標籤要重定位到頭條標籤(也就是第一個頁籤)。看下面的程式碼:

private long exitTime = 0;

    /**
     * 重寫返回鍵功能,實現連按兩次退出App
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // 按返回鍵的時候讓新聞頁面的頁籤回到第一個頁籤位置
            NewsPager newsPager = (NewsPager) mPagerList.get(0);
            if (newsPager.vpNews.getCurrentItem() == 0) {
                exit();
            } else {
                newsPager.mIndicator.setCurrentItem(0);
            }

            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void exit() {
        if (System.currentTimeMillis() - exitTime > 2000) {
            Toast.makeText(getApplicationContext(), "再按一次返回退出",
                    Toast.LENGTH_SHORT).show();
            exitTime = System.currentTimeMillis();
        } else {
            finish();
            System.exit(0);
        }
    }

這裡重寫了onKeyDown()方法,獲取到第一個新聞子頁面,然後進行條件判定:如果當前是在新聞頁面的第一個標籤(也就是頭條頁籤),那麼就會執行下面的exit()方法進行兩次返回鍵退出的實現效果;如果當前不是在新聞頁面的第一個標籤,那麼點選返回鍵的時候就會跳轉到新聞頁面的第一個標籤(頭條頁籤)。
在exit()方法中,獲取兩次點選返回鍵的時間,如果小於2s,就會推出,否則,不退出。

以上就是小專案 口袋新聞主介面MainActivity的介紹,有錯誤的地方歡迎指出來,感謝閱讀!

相關推薦

專案口袋新聞介面實現MainActivity

首先看一下介面效果圖,MainActivity就是使用ViewPager實現新聞、精選和設定三個頁面的。 以下展開來看一下,首先看一下佈局檔案: <LinearLayout xmlns:android="http://schemas.android

專案--貝葉斯實現拼寫檢查

求解:argmaxc P(c|w) -> argmaxc P(w|c)P©/P(w) P©:文章中出現一個正確拼寫詞c的概率,也就是語料庫中c出現的概率有多大 P(w|c):在使用者想鍵入c的情況下敲成w的概率,也就是使用者會以多大的概率把c敲錯成w argmaxc:用來列舉所有可能的

Linux(專案)————shell的實現,包含重定向、內建命令。

bash原理: 通過上面bash的原理我們可以,瞭解到shell的框架與流程: 1.等待使用者輸入命令。 2.解析使用者輸入的字串。 3.建立子程序執行exec程式替換 4.父程序等待子程序退出。 迴圈執行1~4步驟,即可完成my_shell。 最簡單版本的my_shell實現:

Android開發丶底部導航欄的介面實現

在主流app中,應用的主介面都是底部含有多個標籤的導航欄,點選可以切換到相應的介面,如圖: 接下來將描述下其實現過程。 1.首先是分析介面,底部導航欄我們可以用一個佔滿螢幕寬度、包裹著數個標籤TextView、方向為橫向horizontal的線性佈局LinearLay

Android應用經典介面框架二:仿網易新聞客戶端、CSDN 客戶端 (Fragment ViewPager)

第二種主介面風格則是以網易新聞、鳳凰新聞以及新推出的新浪部落格(閱讀版)為代表,使用ViewPager+Fragment,即ViewPager裡介面卡裡放的不是一般的View,而是Fragment。所以介面卡不能繼承PagerAdapter,而要繼承FragmentPager

Linux專案:停車場的實現

標頭檔案: /****************************wddv587************************************* FileName: 停車場/parking.h Verson: 1.0 Date: 2018.0814

標籤欄介面實現(一)

現在Fragment的應用真的是越來越廣泛了,之前Android在3.0版本加入Fragment的時候,主要是為了解決Android Pad螢幕比較大,空間不能充分利用的問題,但現在即使只是在手機上,也有很多的場景可以運用到Fragment了,今天我們就來學習其中一個

基於Android的巫新聞客戶端開發--介面業務邏輯實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android實現百度雲介面框架

新版的Android版百度雲介面效果非常炫,給人煥然一新的感覺,如下圖所示。 其實仔細研究,會發現也並不是那麼複雜: 1.整個介面主容器是一個ViewPager,只是在左下角有一個切換的Button。 2.ViewPager有兩個介面,由Fragment實現,並且加入

Laravel專案第4節 Laravel-通過表單實現新增及操作狀態提示功能

第4節 Laravel-通過表單實現新增及操作狀態提示功能 4.1 顯示新增表單檢視 4.2 通過模型實現新增 4.3 操作狀態提示 4.1 顯示新增表單檢視 修改邊欄的連結 \resources\views\shared\siderbar.blade.php <div class="col-

javaWeb專案用過濾器filter實現登陸成功後才能訪問頁面,否則直接輸入主頁面的地址自動跳轉到登陸介面

想用Filter實現一個登陸驗證的功能,實現登陸成功後才能訪問主頁面,否則直接輸入主頁面的地址會自動跳轉到登陸介面 原理很簡單,每次登陸成功後,建立一個session域物件,將登陸成功的使用者名稱儲存在session中,過濾器要做的就是在每一次跳轉到jsp頁

Laravel專案第7節 Laravel-通過表單實現修改

第7節 Laravel-通過表單實現修改 7.1 給HTML新增連結 7.2 建立修改的表單頁面 7.3 使用模型實現修改操作 7.1 給HTML新增連結 在 \resources\views\student\index.blade.php 中給修改新增 href 屬性。 <a href="{{ u

Android基礎知識【專案實訓-實現介面上下兩級導航】【3】

【該專案實訓是Android基礎知識的一個綜合練習,特別提示:專案中會用到一些圖片素材,都是隨意整理的,稍後會上傳一個資源,包含該事項專案的基本功能,也含有圖片素材】 【專案題目】:校園訂餐App設計 綜合案例 【目標】 歡迎介面過後,應該顯示app的主介面了,根據【

初學構建專案倉庫管理系統主頁面的實現(二)

       上一篇部落格我講了資料庫的建立以及管理員表的實現和管理員登入頁面的實現,這一篇我來說說倉庫管理系統的主頁面的實現。主要是用eclipse中的外掛windowbuilder來實現。其下載地址為:http://www.eclipse.org/windowbuild

Android專案三 splash介面

------- 源自夢想、永遠是你IT事業的好友、只是勇敢地說出我學到! ---------- 按慣例,寫在前面的:可能在學習Android的過程中,大家會和我一樣,學習過大量的基礎知識,很多的知識點也都能說出了123來,但是這些孤立的點終究顯得太零散了,因此,我想從今天

使用Fragment相容手機平板-設定介面的模仿簡單實現

轉自:  記得我之前參與開發過一個華為的專案,要求程式可以支援好幾種終端裝置,其中就包括Android手機和Android Pad。然後為了節省人力,公司無節操地讓Android手機和Android Pad都由我們團隊開發。當時專案組定的方案是,製作兩個版本的App,

黑式爛代碼微信APP支付 + 退款(JAVA實現)

result 技術分享 文件 index tsig eat java ava fan 首先,你得先有微信開發平臺賬號密碼還需要開通應用,然後還有微信服務商平臺商戶版賬號(這些我都是給產品經理拿的) 其次我認為你先去看一看微信開發平臺的文檔! https://pay.wei

微信程式(看文件寫例項十)微信程式課堂寶APP實現我的模組相關介面及邏輯

繼上篇博文,這篇完成最後一個模組,即我的模組。 一、頁面效果 這個模組是和使用者型別相關的,因此老師賬號和學生賬號能看的功能不一樣,老師端效果如下: 點選頭像到達個人資訊如下: 點選後可以做相應的修改。學生端的介面如下: 修改密碼的頁面如下: &nbs

微信程式(看文件寫例項三)微信程式課堂寶APP實現整體介面框架及首頁佈局

一、首頁佈局簡單思路 回顧上一篇博文,首頁的內容主要有輪播圖,橫向滑動選單以及選單對應的view,橫向滑動選單有簽到、課堂測試、模擬測試、課堂提問、答問記錄五個選項,當點選選項時更新顯示view。由於素材和時間有限,所以佈局做得相對簡單,主要是側重思路及程式碼邏輯。 二、輪播圖 檢視文件

VUE專案問題用axios外掛取本地json檔案,報404錯誤。

一、問題 在用axios獲取本地json資料時,總是報404錯誤。 百思不得其解。 二、經過 看網友們都是把本地json檔案放在static檔案中。 我寫的專案存放在assets中,恍然大悟,應該是檔案位置。 三、結果 檔案改存為static axios({