NewsApp03

作者: GeekGray | 来源:发表于2018-10-03 19:41 被阅读4次

    阅读原文

    顶部新闻轮播图事件处理

    重写dispatchTouchEvent,并且要在按下的时候

    getParent().requestDisallowInterceptTouchEvent(true);
    

    判断滑动方向,在X轴和Y轴滑动的绝对值谁大就是在什么方向滑动

    一,竖直方向滑动

    getParent().requestDisallowInterceptTouchEvent(false);
    

    二,水平方向滑动

    2.1,当滑动到ViewPager的第0个页面,并且是从左到右滑动

    getParent().requestDisallowInterceptTouchEvent(false);
    

    2.2,当滑动到ViewPager的最后一个页面,并且是从右到左滑动

    getParent().requestDisallowInterceptTouchEvent(false);
    

    2.3,其他

    getParent().requestDisallowInterceptTouchEvent(true);
    

    自定义HorizontalScrollViewPager

    /**
     * @author: Hashub
     * @WeChat: NGSHMVP
     * @Date: 2018/9/9 18:46
     * @function:水平方向滑动的ViewPager
     */
    public class HorizontalScrollViewPager extends ViewPager
    {
        /**
         * 起始坐标
         */
        private float startX;
        private float startY;
    
        public HorizontalScrollViewPager(Context context)
        {
            super(context);
        }
    
        public HorizontalScrollViewPager(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev)
        {
            switch (ev.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    //请求父层视图不拦截,当前控件的事件
                    getParent().requestDisallowInterceptTouchEvent(true);//都把事件传给当前控件(HorizontalScrollViewPager)
                    //1.记录起始坐标
                    startX = ev.getX();
                    startY = ev.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    //2.来到新的坐标
                    float endX = ev.getX();
                    float endY = ev.getY();
                    //3.计算偏移量
                    float distanceX = endX - startX;
                    float distanceY = endY - startY;
                    //4.判断滑动方向
                    if (Math.abs(distanceX) > Math.abs(distanceY))
                    {
                        //水平方向滑动
                       //2.1,当滑动到ViewPager的第0个页面,并且是从左到右滑动
                        //getParent().requestDisallowInterceptTouchEvent(false);
                        if (getCurrentItem() == 0 && distanceX > 0)
                        {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
    
                      //2.2,当滑动到ViewPager的最后一个页面,并且是从右到左滑动
                       // getParent().requestDisallowInterceptTouchEvent(false);
                        else if ((getCurrentItem() == (getAdapter().getCount() - 1)) && distanceX < 0)
                        {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                      //2.3,其他,中间部分
                      //getParent().requestDisallowInterceptTouchEvent(true);
                        else
                        {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        }
                    }
                    else
                    {
                        //竖直方向滑动
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                default:
                    break; 
            }
            return super.dispatchTouchEvent(ev);
        }
    }
    

    自定义下拉刷新(touch事件处理

    1.自定义Listview实现下拉刷新,RefreshListview,必须重新带有两个参数的构造方法

    2.在构造方法里面,把下拉刷新控件添加

    自定义ProgressBar

    3.下拉刷新控件隐藏和显示的原理

    View.setPadding(0,-控件高,0,0);//完全隐藏
    
    View.setPadding(0,0,0,0);//完全显示
    
    View.setPadding(0,控件高,0,0);//2倍高显示
    

    4.拖动实现隐藏和显示下拉刷新控件

      a,重写onTouchEvent()
        在down startY;
      b,计算滑动的距离
       float distanceY = endY - startY;
    
       int paddingTop = -控件高 + distanceY;
       View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件
    
      c,设置效果
    

    刷新的效果的实现

    1.定义刷新的三个状态

     /**
     * 下拉刷新控件的高
     */
    private int pullDownRefreshHeight;
    
    /**
     下拉刷新
     */
    public static final int PULL_DOWN_REFRESH = 0;
    
    /**
     手松刷新
     */
    public static final int RELEASE_REFRESH = 1;
    
    
    /**
     正在刷新
     */
    public static final int REFRESHING = 2;
    
    
    /**
     * 当前状态
     */
    private int currentStatus = PULL_DOWN_REFRESH;
    

    自定义下拉刷新RefreshListview

    /**
     * @author: Hashub
     * @WeChat: NGSHMVP
     * @Date: 2018/9/6 19:37
     * @function:自定义下拉刷新
     */
    public class RefreshListview extends ListView
    {
        /**
         * 下拉刷新和顶部轮播图
         */
        private LinearLayout headerView;
    
        /**
         * 下拉刷新控件
         */
        private View ll_pull_down_refresh;
        private ImageView iv_arrow;
        private ProgressBar pb_status;
        private TextView tv_status;
        private TextView tv_time;
        /**
         * 下拉刷新控件的高
         */
        private int pullDownRefreshHeight;
    
        /**
         * 下拉刷新
         */
        public static final int PULL_DOWN_REFRESH = 0;
    
        /**
         * 手松刷新
         */
        public static final int RELEASE_REFRESH = 1;
    
    
        /**
         * 正在刷新
         */
        public static final int REFRESHING = 2;
    
    
        /**
         * 当前状态
         */
        private int currentStatus = PULL_DOWN_REFRESH;
    
        private Animation upAnimation;
        private Animation downAnimation;
        /**
         * 加载更多的控件
         */
        private View footerView;
        /**
         * 加载更多控件高
         */
        private int footerViewHeight;
        /**
         * 是否已经加载更多
         */
        private boolean isLoadMore = false;
        /**
         * 顶部轮播图部分
         */
        private View topNewsView;
        /**
         * ListView在Y轴上的坐标
         */
        private int listViewOnScreenY = -1;
    
    
        public RefreshListview(Context context)
        {
            this(context, null);
        }
    
        public RefreshListview(Context context, AttributeSet attrs)
        {
            this(context, attrs, 0);
        }
    
        public RefreshListview(Context context, AttributeSet attrs, int defStyleAttr)
        {
            super(context, attrs, defStyleAttr);
            initHeaderView(context);
            initAnimation();
            initFooterView(context);
    
        }
    
        private void initFooterView(Context context)
        {
            footerView = View.inflate(context, R.layout.refresh_footer, null);
            footerView.measure(0, 0);
            footerViewHeight = footerView.getMeasuredHeight();
    
    
            footerView.setPadding(0, -footerViewHeight, 0, 0);
    
            //ListView添加footer
            addFooterView(footerView);
    
    
            //监听ListView的滚动
            setOnScrollListener(new MyOnScrollListener());
        }
    
        /**
         * 添加顶部轮播图
         *
         * @param topNewsView
         */
        public void addTopNewsView(View topNewsView)
        {
            if (topNewsView != null)
            {
                this.topNewsView = topNewsView;
                headerView.addView(topNewsView);
            }
    
    
        }
    
        class MyOnScrollListener implements OnScrollListener
        {
    
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState)
            {
                //当静止或者惯性滚动的时候
                if (scrollState == OnScrollListener.SCROLL_STATE_IDLE || scrollState == OnScrollListener.SCROLL_STATE_FLING)
                {
                    //并且是最后一条可见
                    if (getLastVisiblePosition() >= getCount() - 1)
                    {
    
                        //1.显示加载更多布局
                        footerView.setPadding(8, 8, 8, 8);
                        //2.状态改变
                        isLoadMore = true;
                        //3.回调接口
                        if (mOnRefreshListener != null)
                        {
                            mOnRefreshListener.onLoadMore();
                        }
                    }
                }
    
    
            }
    
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
            {
    
            }
        }
    
    
        private void initAnimation()
        {
            upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
            upAnimation.setDuration(500);
            upAnimation.setFillAfter(true);
    
            downAnimation = new RotateAnimation(-180, -360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
            downAnimation.setDuration(500);
            downAnimation.setFillAfter(true);
        }
    
        private void initHeaderView(Context context)
        {
            headerView = (LinearLayout) View.inflate(context, R.layout.refresh_header, null);
            //下拉刷新控件
            ll_pull_down_refresh = headerView.findViewById(R.id.ll_pull_down_refresh);
            iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow);
            pb_status = (ProgressBar) headerView.findViewById(R.id.pb_status);
            tv_status = (TextView) headerView.findViewById(R.id.tv_status);
            tv_time = (TextView) headerView.findViewById(R.id.tv_time);
    
            //测量
            ll_pull_down_refresh.measure(0, 0);
            pullDownRefreshHeight = ll_pull_down_refresh.getMeasuredHeight();
    
            //默认隐藏下拉刷新控件
            // View.setPadding(0,-控件高,0,0);//完全隐藏
            //View.setPadding(0, 0,0,0);//完全显示
            ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);
    
            //添加ListView的头
            addHeaderView(headerView);
        }
    
        private float startY = -1;
    
        @Override
        public boolean onTouchEvent(MotionEvent ev)
        {
            switch (ev.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    //1.记录起始坐标
                    startY = ev.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (startY == -1)
                    {
                        startY = ev.getY();
                    }
    
                    //判断顶部轮播图是否完全显示,只有完全显示才会有下拉刷新
    
                    boolean isDisplayTopNews = isDisplayTopNews();
                    if (!isDisplayTopNews)
                    {
                        //加载更多
                        break;
                    }
    
    
                    //如果是正在刷新,就不让再刷新了
                    if (currentStatus == REFRESHING)
                    {
                        break;
                    }
                    //2.来到新的坐标
                    float endY = ev.getY();
                    //3.记录滑动的距离
                    float distanceY = endY - startY;
                    if (distanceY > 0)
                    {//下拉
    
                        //int paddingTop = -控件高 + distanceY;
                        int paddingTop = (int) (-pullDownRefreshHeight + distanceY);
    
                        if (paddingTop < 0 && currentStatus != PULL_DOWN_REFRESH)
                        {
                            //下拉刷新状态
                            currentStatus = PULL_DOWN_REFRESH;
                            //更新状态
                            refreshViewState();
    
                        }
                        else if (paddingTop > 0 && currentStatus != RELEASE_REFRESH)
                        {
                            //手松刷新状态
                            currentStatus = RELEASE_REFRESH;
                            //更新状态
                            refreshViewState();
    
                        }
    
                        ll_pull_down_refresh.setPadding(0, paddingTop, 0, 0);
                        //View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    startY = -1;
                    if (currentStatus == PULL_DOWN_REFRESH)
                    {
    //                    View.setPadding(0,-控件高,0,0);//完全隐藏
                        ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);
                    }
                    else if (currentStatus == RELEASE_REFRESH)
                    {
                        //设置状态为正在刷新
                        currentStatus = REFRESHING;
    
                        refreshViewState();
    
    //                    View.setPadding(0,0,0,0);//完全显示
                        ll_pull_down_refresh.setPadding(0, 0, 0, 0);
    
    
                        //回调接口
                        if (mOnRefreshListener != null)
                        {
                            mOnRefreshListener.onPullDownRefresh();
                        }
                    }
                    break;
    
            }
            return super.onTouchEvent(ev);
        }
    
        /**
         * 判断是否完全显示顶部轮播图
         * 当ListView在屏幕上的Y轴坐标小于或者等于顶部轮播图在Y轴的坐标的时候,顶部轮播图完全显示
         *
         * @return
         */
        private boolean isDisplayTopNews()
        {
    
            if (topNewsView != null)
            {
                //1.得到ListView在屏幕上的坐标
                int[] location = new int[2];
                if (listViewOnScreenY == -1)
                {
                    getLocationOnScreen(location);
                    listViewOnScreenY = location[1];
                }
    
                //2.得到顶部轮播图在屏幕上的坐标
                topNewsView.getLocationOnScreen(location);
                int topNewsViewOnScreenY = location[1];
    
    //        if(listViewOnScreenY <= topNewsViewOnScreenY){
    //            return true;
    //        }else{
    //            return false;
    //        }
    
                return listViewOnScreenY <= topNewsViewOnScreenY;
            }
            else
            {
                return true;
            }
    
        }
    
        private void refreshViewState()
        {
    
            switch (currentStatus)
            {
                case PULL_DOWN_REFRESH://下拉刷新状态
                    iv_arrow.startAnimation(downAnimation);
                    tv_status.setText("下拉刷新...");
                    break;
    
                case RELEASE_REFRESH://手松刷新状态
                    iv_arrow.startAnimation(upAnimation);
                    tv_status.setText("手松刷新...");
                    break;
                case REFRESHING://正在刷新状态
                    tv_status.setText("正在刷新...");
                    pb_status.setVisibility(VISIBLE);
                    iv_arrow.clearAnimation();
                    iv_arrow.setVisibility(GONE);
                    break;
            }
    
        }
    
        /**
         * 当联网成功和失败的时候回调该方法
         * 用户刷新状态的还原
         *
         * @param sucess
         */
        public void onRefreshFinish(boolean sucess)
        {
            if (isLoadMore)
            {
                //加载更多
                isLoadMore = false;
                //隐藏加载更多布局
                footerView.setPadding(0, -footerViewHeight, 0, 0);
            }
            else
            {
                //下拉刷新
                tv_status.setText("下拉刷新...");
                currentStatus = PULL_DOWN_REFRESH;
                iv_arrow.clearAnimation();
                pb_status.setVisibility(GONE);
                iv_arrow.setVisibility(VISIBLE);
                //隐藏下拉刷新控件
                ll_pull_down_refresh.setPadding(0, -pullDownRefreshHeight, 0, 0);
                if (sucess)
                {
                    //设置最新更新时间
                    tv_time.setText("上次更新时间:" + getSystemTime());
                }
            }
    
    
        }
    
        /**
         * 得到当前Android系统的时间
         *
         * @return
         */
        private String getSystemTime()
        {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return format.format(new Date());
        }
    
    
        /**
         * 监听控件的刷新
         */
        public interface OnRefreshListener
        {
    
            /**
             * 当下拉刷新的时候回调这个方法
             */
            public void onPullDownRefresh();
    
            /**
             * 当加载更多的时候回调这个方法
             */
            public void onLoadMore();
    
        }
    
        private OnRefreshListener mOnRefreshListener;
    
    
        /**
         * 设置监听刷新,由外界设置
         */
        public void setOnRefreshListener(OnRefreshListener l)
        {
            this.mOnRefreshListener = l;
    
        }
    }
    

    PullToRefresh下拉刷新的使用

    1.下载

    https://github.com/chrisbanes/Android-PullToRefresh
    

    2.导入运行PullToRefresh案例

    3.参照案例,关联库

    4.专题页面也实现了新闻详情页面的效果

    5.使用PullToRefresh

    加载布局,且PullRefreshListView.getRefreshableView();得到返回值为ListView类型

     @Override
        public View initView()
        {
            View view = View.inflate(context, R.layout.topic_detail_pager, null);
    
    
            mPullRefreshListView = (PullToRefreshListView) view.findViewById(R.id.pull_refresh_list);
    
            listview = mPullRefreshListView.getRefreshableView();
    
            /**
             * Add Sound Event Listener
             */
            SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(context);
            soundListener.addSoundEvent(PullToRefreshBase.State.PULL_TO_REFRESH, R.raw.pull_event);
            soundListener.addSoundEvent(PullToRefreshBase.State.RESET, R.raw.reset_sound);
            soundListener.addSoundEvent(PullToRefreshBase.State.REFRESHING, R.raw.refreshing_sound);
            mPullRefreshListView.setOnPullEventListener(soundListener);
    
    
            View topNewsView = View.inflate(context, R.layout.topnews, null);
            viewpager = (HorizontalScrollViewPager) topNewsView.findViewById(R.id.viewpager);
            tv_title = (TextView) topNewsView.findViewById(R.id.tv_title);
            ll_point_group = (LinearLayout) topNewsView.findViewById(R.id.ll_point_group);
    
            //把顶部轮播图部分视图,以头的方式添加到ListView中
            listview.addHeaderView(topNewsView);
    
    //        listview.addTopNewsView(topNewsView);
    
            //设置监听下拉刷新
    //        listview.setOnRefreshListener(new MyOnRefreshListener());
            mPullRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>()
            {
                @Override
                public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView)
                {
                    getDataFromNet();
                }
    
                @Override
                public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView)
                {
                    if (TextUtils.isEmpty(moreUrl))
                    {
                        //没有更多数据
                        Toast.makeText(context, "没有更多数据", Toast.LENGTH_SHORT).show();
    //                    listview.onRefreshFinish(false);
                        mPullRefreshListView.onRefreshComplete();
                    }
                    else
                    {
                        getMoreDataFromNet();
                    }
                }
            });
    
            return view;
        }
    

    设置ListView的item的点击监听

     class MyOnItemClickListener implements AdapterView.OnItemClickListener
        {
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
    
                int realPosition = position - 1;
                TabDetailPagerBean.DataEntity.NewsData newsData = news.get(realPosition);
    //            Toast.makeText(context, "newsData==id=="+newsData.getId()+",newsData_title=="+newsData.getTitle(), Toast.LENGTH_SHORT).show();
    
                LogUtil.e("newsData==id==" + newsData.getId() + ",newsData_title==" + newsData.getTitle() + ",url===" + newsData.getUrl());
                //1,取出保存的id集合
                String idArray = CacheUtils.getString(context, READ_ARRAY_ID);//"3511,"
                //2,判断是否存在,如果不存在,才保存,并且刷新适配器
                if (!idArray.contains(newsData.getId() + ""))
                {//3512
    
                    CacheUtils.putString(context, READ_ARRAY_ID, idArray + newsData.getId() + ",");//"3511,3512,"
    
                    //刷新适配器
                    adapter.notifyDataSetChanged();//getCount-->getView
    
                }
    
                //跳转到新闻浏览页面
                Intent intent = new Intent(context, NewsDetailActivity.class);
                intent.putExtra("url", Constants.BASE_URL + newsData.getUrl());
                context.startActivity(intent);
    
    
            }
        }
    

    设置点击过的listview的item条目文字标题变灰色

    //在ListView的适配器TabDetailPagerListAdapter的getView方法中
    
      String idArray = CacheUtils.getString(context, READ_ARRAY_ID);
                if (idArray.contains(newsData.getId() + ""))
                {
                    //设置灰色
                    viewHolder.tv_title.setTextColor(Color.GRAY);
                }
                else
                {
                    //设置黑色
                    viewHolder.tv_title.setTextColor(Color.BLACK);
                }
    

    TabLayout的使用

    TabLayout原生的用法

    参照网址:

    https://segmentfault.com/a/1190000003500271 
    

    1.关联库

    compile 'com.android.support:design:23.3.0'
    

    2.布局写上TabLayout

                     <android.support.design.widget.TabLayout
                      android:id="@+id/tabLayout"
                      android:layout_width="0dp"
                      android:layout_height="wrap_content"
                      android:layout_gravity="center_vertical"
                      android:layout_weight="1" />
    

    3.实例化

    @ViewInject(R.id.tablayout)
    private TabLayout tabLayout;
    

    4.TabLayout和ViewPager关联

       tabLayout.setupWithViewPager(viewPager);
        //注意以后监听页面的变化 ,TabPageIndicator监听页面的变化
    
        viewPager.addOnPageChangeListener(new MyOnPageChangeListener());
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    

    5.适配器中重写getPageTitle方法

     class MyNewsMenuDetailPagerAdapter extends PagerAdapter {
    
            @Override
            public CharSequence getPageTitle(int position) {
                return children.get(position).getTitle();
            }
    
           .....
        }
    

    6.解决TabLayout和ViewPagerIndicator的兼容问题

     <activity
            android:name=".activity.MainActivity"
            android:theme="@style/Theme.PageIndicatorDefaults" />
    

    6.2 ViewPagerIndicator库修改成如下

    <style name="Theme.PageIndicatorDefaults" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="vpiIconPageIndicatorStyle">@style/Widget.IconPageIndicator</item>
        <item name="vpiTabPageIndicatorStyle">@style/Widget.TabPageIndicator</item>
    </style>
    

    6.3添加V7包

     compile 'com.android.support:appcompat-v7:23.3.0'
    

    TabLayout设置指针颜色和高度&文字颜色

    1.添加样式

          <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="wrap_content"
                style="@style/MyCustomTabLayout"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
    
    1. values目录下styles.xml里面

       MyCustomTabLayout样式
      
         <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
       
               <item name="tabMaxWidth">72dp</item>
               <item name="tabMinWidth">72dp</item>
               <item name="tabIndicatorColor">#ff0000</item>
               <item name="tabIndicatorHeight">2dp</item>
               <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
               <item name="tabSelectedTextColor">@android:color/holo_red_light</item>
       
           </style>
       
           <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
               <item name="android:textSize">16sp</item>
               <item name="android:textColor">@android:color/black</item>
               <item name="textAllCaps">false</item>
           </style>
      

    TabLayout自定义样式

    1.设置的样式

    vp_news_menu_detailpager.setAdapter(adapter);
    
    
        //6.关联ViewPager,TabPageIndicator才可以显示
    
        tabLayout.setupWithViewPager(vp_news_menu_detailpager);
    
        //设置滚动模式
    
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        //设置页面的监听需要用TabPageIndicator
    
        
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            TabLayout.Tab tab = tabLayout.getTabAt(i);
            tab.setCustomView(getTabView(i));
        }
    
    
    
        注意了setupWithViewPager必须在ViewPager.setAdapter()之后调用
    

    //自定义Tab

    2.在适配器中添加getTabView()方法

      public View getTabView(int position){
        View view = LayoutInflater.from(context).inflate(R.layout.tab_item, null);
        TextView tv= (TextView) view.findViewById(R.id.textView);
        tv.setText(childrenDatas.get(position).getTitle());
        ImageView img = (ImageView) view.findViewById(R.id.imageView);
        img.setImageResource(R.drawable.dot_focus);
        return view;
      }
    
    
    
     布局文件tab_item.xml文件
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical">
    
    
        <TextView
            android:text="text"
            android:id="@+id/textView"
            android:textColor="#000000"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp" />
    
        <ImageView
            android:src="@drawable/dot_focus"
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true" />
    
    </LinearLayout>
    

    NewsDetailActivity

    /**
     * @author: Hashub
     * @WeChat: NGSHMVP
     * @Date: 2018/9/5 16:37
     * @function:新闻浏览页面
     */
    public class NewsDetailActivity extends Activity implements View.OnClickListener
    {
    
        private TextView tvTitle;
        private ImageButton ibMenu;
        private ImageButton ibBack;
        private ImageButton ibTextsize;
        private ImageButton ibShare;
    
        private WebView webview;
        private ProgressBar pbLoading;
        private String url;
        private WebSettings webSettings;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_news_detail);
            findViews();
            getData();
        }
        /**
         * Find the Views in the layout<br />
         * <br />
         * Auto-created on 2016-08-24 09:43:47 by Android Layout Finder
         * (http://www.buzzingandroid.com/tools/android-layout-finder)
         */
        private void findViews()
        {
            tvTitle = (TextView) findViewById(R.id.tv_title);
            ibMenu = (ImageButton) findViewById(R.id.ib_menu);
            ibBack = (ImageButton) findViewById(R.id.ib_back);
            ibTextsize = (ImageButton) findViewById(R.id.ib_textsize);
            ibShare = (ImageButton) findViewById(R.id.ib_share);
            webview = (WebView) findViewById(R.id.webview);
            pbLoading = (ProgressBar) findViewById(R.id.pb_loading);
    
            tvTitle.setVisibility(View.GONE);
            ibMenu.setVisibility(View.GONE);
            ibBack.setVisibility(View.VISIBLE);
            ibTextsize.setVisibility(View.VISIBLE);
            ibShare.setVisibility(View.VISIBLE);
    
            ibBack.setOnClickListener(this);
            ibTextsize.setOnClickListener(this);
            ibShare.setOnClickListener(this);
        }
    
        /**
         * Handle button click events<br />
         * <br />
         * Auto-created on 2016-08-24 09:43:47 by Android Layout Finder
         * (http://www.buzzingandroid.com/tools/android-layout-finder)
         */
        @Override
        public void onClick(View v)
        {
            if (v == ibBack)
            {
                // Handle clicks for ibBack
                finish();
            }
            else if (v == ibTextsize)
            {
                // Handle clicks for ibTextsize
    //            Toast.makeText(NewsDetailActivity.this, "设置文字大小", Toast.LENGTH_SHORT).show();
                showChangeTextSizeDialog();
            }
            else if (v == ibShare)
            {
                // Handle clicks for ibShare
    //            Toast.makeText(NewsDetailActivity.this, "分享", Toast.LENGTH_SHORT).show();
                //showShare();
            }
        }
    
        private int tempSize = 2;
        private int realSize = tempSize;
    
        private void showChangeTextSizeDialog()
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("设置文字大小");
            String[] items = {"超大字体", "大字体", "正常字体", "小字体", "超小字体"};
            builder.setSingleChoiceItems(items, realSize, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    tempSize = which;
                }
            });
            builder.setNegativeButton("取消", null);
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
    
                    realSize = tempSize;
                    changeTextSize(realSize);
                }
            });
            builder.show();
    
        }
    
        private void changeTextSize(int realSize)
        {
            switch (realSize)
            {
                case 0://超大字体
                    webSettings.setTextZoom(200);
                    break;
                case 1://大字体
                    webSettings.setTextZoom(150);
                    break;
                case 2://正常字体
                    webSettings.setTextZoom(100);
                    break;
                case 3://小字体
                    webSettings.setTextZoom(75);
                    break;
                case 4://超小字体
                    webSettings.setTextZoom(50);
                    break;
            }
    
        }
    
        private void getData()
        {
            url = getIntent().getStringExtra("url");
    
            //设置支持javaScript
            webSettings = webview.getSettings();
            //设置支持javaScript
            webSettings.setJavaScriptEnabled(true);
            //设置双击变大变小
            webSettings.setUseWideViewPort(true);
            //增加缩放按钮
            webSettings.setBuiltInZoomControls(true);
            //设置文字大小
    //        webSettings.setTextSize(WebSettings.TextSize.NORMAL);
            webSettings.setTextZoom(100);
            //不让从当前网页跳转到系统的浏览器中
            webview.setWebViewClient(new WebViewClient()
            {
                //当加载页面完成的时候回调
                @Override
                public void onPageFinished(WebView view, String url)
                {
                    super.onPageFinished(view, url);
                    pbLoading.setVisibility(View.GONE);
                }
            });
            webview.loadUrl(url);
    //        webview.loadUrl("http://www.atguigu.com/teacher.shtml");
    
        }
    }

    相关文章

      网友评论

          本文标题:NewsApp03

          本文链接:https://www.haomeiwen.com/subject/uqhtaftx.html