精华内容
下载资源
问答
  • Android项目开发详解,完整扫描版

    千次下载 热门讨论 2014-04-16 07:54:46
    《移动平台开发书库:Android项目开发详解》从实战的角度出发,介绍了基于Android环境的Mobile/Server应用系统开发,涉及移动客户端和服务器端的开发环节,以满足智能手机在线应用的需求。全书以一个Android应用程序...
  • android项目实例 商业项目源代码

    千次下载 热门讨论 2011-11-14 15:50:30
    使用本Android SNS 178折社区 应用开源框架 可以迅速开发android手机应用 应用范围 商城android应用 交友android手机应用 开发者:178折网购社区 网址:http://www.178zhe.com
  • 在前几篇文章 android项目案例2- 基于Android studio的android百度地图 , android项目案例1- 基于Android studio的仿微信底部导航栏实现 android项目案例3- 基于Android studio的android的fragment网页嵌套 ,...

    在前几篇文章   android项目案例2- 基于Android studio的android百度地图   ,  android项目案例1- 基于Android studio的仿微信底部导航栏实现  android项目案例3- 基于Android studio的android的fragment网页嵌套     ,中介绍了相关的技术,需要的小伙伴可以查看,不懂得可以留言我。

    今天介绍的是很多人进行Android设计的时候都会用到的功能模块------个人中心

    以下是我的项目中的个人中心示意图:

    接下来进入正题——————》》》》》

    1.首先设置UI界面布局。XML文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#F0F3F6">
        <!-- 全圆角-->
        <LinearLayout style="@style/wrap_layout">
            <LinearLayout style="@style/single_layout">
                <TextView style="@style/usertext"
                    android:onClick="xtjumpToNe"
                    android:clickable="true"
                    android:text="登 陆 "
                    android:id="@+id/login"  />
    
                <ImageView style="@style/login_icon"/>
    
                <TextView style="@style/usertext"
                    android:id="@+id/username"
                    android:text="未登录" />
    
                <ImageView style="@style/img_arrow"/>
            </LinearLayout>
        </LinearLayout>
    
    
        <LinearLayout style="@style/wrap_layout" >
            <!-- 上圆角-->
            <LinearLayout style="@style/top_layout">
                <TextView style="@style/usertext"
                    android:text="个性签名"
                    android:id="@+id/signature" />
                <TextView  style="@style/usertext"
                    android:text=" "
                    android:id="@+id/signature_mess"/>
                <ImageView style="@style/img_arrow"/>
            </LinearLayout>
    
    
            <!-- 分割线 -->
            <View style="@style/bg_line"/>
    
    
            <!-- 无圆角-->
            <LinearLayout style="@style/mid_layout">
                <TextView style="@style/usertext" android:text="我的资料"
                    android:id="@+id/inform"/>
                <ImageView style="@style/img_arrow"/>
            </LinearLayout>
    
            <View style="@style/bg_line"/>
    
            <!-- 下圆角-->
            <LinearLayout style="@style/bottom_layout">
                <TextView style="@style/usertext"
                    android:id="@+id/mess_inform"
                    android:text="消息中心" />
                <ImageView style="@style/img_arrow"/>
            </LinearLayout>
    
        </LinearLayout>
    
    
        <!-- 全圆角-->
        <LinearLayout style="@style/wrap_layout">
            <LinearLayout style="@style/single_layout">
                <TextView style="@style/usertext"
                    android:id="@+id/access"
                    android:text="辅助功能"/>
                <ImageView style="@style/img_arrow"/>
            </LinearLayout>
            <!--&lt;!&ndash; 分割线 &ndash;&gt;-->
            <!--<View style="@style/bg_line"/>-->
            <!--<LinearLayout style="@style/single_layout">-->
            <!--<TextView style="@style/usertext" android:text="退出"-->
            <!--android:id="@+id/out"/>-->
            <!--<ImageView style="@style/img_arrow"/>-->
            <!--</LinearLayout>-->
        </LinearLayout>
    
    </LinearLayout>

    2.Activity的实现。java文件

    package com.CWT.navigation.fragment;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.CWT.navigation.Accessibility.accessibility;
    import com.CWT.navigation.MainActivity;
    import com.CWT.navigation.Mess_inform.message_inform;
    import com.CWT.navigation.My_inform.my_inform;
    import com.CWT.navigation.Personal_center.login;
    import com.CWT.navigation.R;
    import com.CWT.navigation.Signature.signature;
    import com.CWT.navigation.adapter.TabCarAdapter;
    import com.CWT.navigation.guide;
    import com.CWT.navigation.help_file.help_File;
    import com.baidu.mapapi.map.BaiduMap;
    
    import static android.content.Context.MODE_PRIVATE;
    import static android.widget.Toast.LENGTH_SHORT;
    
    
    
    public class TabMeFragment extends Fragment {
        @Override
        public void onResume() {
            super.onResume();
            Log.d("TabMeFragment", "resume");
            TextView user_name=(TextView) getActivity().findViewById(R.id.username);
            SharedPreferences read_username = getActivity().getSharedPreferences("loginInfo", MODE_PRIVATE);
            String data_username = read_username.getString("loginUserName", "未登录");
            if(data_username != null){
                user_name.setText(data_username);
                Log.d("TabMeFragment", "data_username != null" + data_username);
            }else{
                Log.d("TabMeFragment", "data_username == null ");
            }
    
        }
    
        private static final String ACTIVITY_TAG ="" ;
        private String bk_message;
    
    
        /**
         * 创建初始化生命周期
         * @param savedInstanceState
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
    
        /**
         * 返回显示视图
         * @param inflater
         * @param container
         * @param savedInstanceState
         * @return
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            String data=null;
            View view = inflater.inflate(R.layout.fragment_tab_me, container, false);
            TextView login = (TextView) view.findViewById(R.id.login);
            TextView signature = (TextView) view.findViewById(R.id.signature);
            TextView inform = (TextView) view.findViewById(R.id.inform);
            TextView mess_inform = (TextView) view.findViewById(R.id.mess_inform);
            TextView access = (TextView) view.findViewById(R.id.access);
            setHasOptionsMenu(true);
    
            /**
             * 登陆
             */
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Toast toast=Toast.makeText(getActivity(),"要显示的内容",Toast.LENGTH_SHORT);
                    // 给bnt1添加点击响应事件
    
                    Intent intent =new Intent(getActivity(),login.class);
                    //启动
                    startActivity(intent);
                }
            });
    
    
            /**
             * 个性签名
             */
            signature.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Toast toast=Toast.makeText(getActivity(),"要显示的内容",Toast.LENGTH_SHORT);
                    // 给bnt1添加点击响应事件
    
                    Intent intent =new Intent(getActivity(),signature.class);
                    //启动
                    startActivity(intent);
                }
            });
    
            /**
             * 消息通知
             */
            mess_inform.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent =new Intent(getActivity(),message_inform.class);
                    //启动
                    startActivity(intent);
                }
            });
    
            /**
             *   我的资料
             */
            inform.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent =new Intent(getActivity(), my_inform.class);
                    //启动
                    startActivity(intent);
                }
            });
    
            access.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent =new Intent(getActivity(), accessibility.class);
                    //启动
                    startActivity(intent);
                }
            });
    
            return view;
        }
     
    }

    实现的代码很简单,我就不多解释了

    请各位大神指教,本博文内容可能写的有错误,有读者发现错误,可以留言我,希望本博文能够帮到大家

    展开全文
  • 使用Android Studio创建Android项目

    千次阅读 2015-12-09 14:54:33
    使用Android Studio创建Android项目

    部分内容摘自github android develop APIGuides的翻译项目 Android官方培训课程中文版,本文仅仅是总结摘抄,用于复习,并提供给广大求知人员参考,不会用于商业途径。感谢前辈们的付出,请尊重原创。
    ###使用Android Studio创建Android项目

    1.启动Android Studio。

    • 如果我们还没有用Android Studio打开过项目,会看到欢迎页,点击New Project。
    • 如果已经用Android Studio打开过项目,点击菜单中的File,选择New Project来创建一个新的项目。

    2.在弹出的窗口(Configure your new project)中填入内容,点击Next。按照如图所示的值进行填写会使得后续的操作步骤不不容易差错。

    选项意义
    Application_Name此处填写想呈现给用户的应用名称,此处我们使用“TextApplication”。
    Company_domain包名限定符,Android Studio会将这个限定符应用于每个新建的Android项目。
    Package_Name是应用的包命名空间(同Java的包的概念),该包名在同一Android系统上所有已安装的应用中具有唯一性,我们可以独立地编辑该包名。
    Project_location操作系统存放项目的目录。

    Configure your new project

    3.在Select the form factors your app will run on窗口勾选Phone and Tablet。

    • Minimum Required SDK表示我们的应用支持的最低Android版本。
      为了支持尽可能多的设备,我们应该设置为能支持你应用核心功能的最低API版本。
      如果某些非核心功能仅在较高版本的API支持,你可以只在支持这些功能的版本上开启它们
      (参考兼容不同的系统版本),此处采用默认值即可。
    • 不要勾选其他选项 (TV, Wear, and Glass) ,点击 Next.
    Select the form factors your app will run on

    4.在Add an activity to 窗口选择Blank Activity,点击 Next.

    add an activity

    5.在Choose options for your new file 窗口修改各个属性的文件名。

    选项意义
    activity name主activity的名称
    layout name布局文件的名称
    title一般与activity name 保持一致
    Menu Resource Name菜单项的布局文件名称

    choose options for your new file

    6.点击Finish完成创建。

    刚创建的Android项目是一个基础的Hello World项目,包含一些默认文件,我们花一点时间看看最重要的部分:

    app/src/main/AndroidManifest.xml

    AndroidManifest.xml文件描述了项目的基本特征并列出了组成应用的各个组件,接下来的学习会更深入了解这个文件并添加更多组件到该文件中。

    app/build.gradle

    Android Studio使用Gradle 编译运行Android工程. 工程的每个模块以及整个工程都有一个build.gradle文件。通常你只需要关注模块的build.gradle文件,该文件存放编译依赖设置,包括defaultConfig设置:

    • compiledSdkVersion 是我们的应用将要编译的目标Android版本,此处默认为你的SDK已安装的最新Android版本(目前应该是4.1或更高版本,如果你没有安装一个可用Android版本,就要先用SDK Manager来完成安装),我们仍然可以使用较老的版本编译项目,但把该值设为最新版本,可以使用Android的最新特性,同时可以在最新的设备上优化应用来提高用户体验。
    • applicationId 创建新项目时指定的包名。
    • minSdkVersion 创建项目时指定的最低SDK版本,是新建应用支持的最低SDK版本。
    • targetSdkVersion 表示你测试过你的应用支持的最高Android版本(同样用API level表示).当Android发布最新版本后,我们应该在最新版本的Android测试自己的应用同时更新target sdk到Android最新版本,以便充分利用Android新版本的特性。更多知识,请阅读Supporting Different Platform Versions
    展开全文
  • Android项目框架搭建(一)

    万次阅读 2019-05-20 23:26:28
    一个完整的Android项目会涉及后台和前端。我们只关注于前端,也就是我们的app本身。 下面列出项目架构需要具备的技术点。(以当前所作项目为例) 1.项目结构(MVP设计模式) 2.屏幕适配 3.程序启动页 4.运行权限...

    本篇先记录下当前项目中涉及的主要技术要点。也算是对所作项目的一次总结。如果这个过程能对你有些许的帮助,那可能就显得有意义点了。

    一个完整的Android项目会涉及后台和前端。我们只关注于前端,也就是我们的app本身。

    下面列出项目架构需要具备的技术点。(以当前所作项目为例)
    1.项目结构(MVP设计模式)
    2.屏幕适配
    3.程序启动页
    4.运行权限获取
    5.基类(BaseActivity/BaseFragment/BaseApplication)
    6.Retrofit(最流行的网络请求框架)+RxJava(链式编程风格+异步)
    7.程序崩溃界面处理

    1.项目结构

    在这里插入图片描述
    项目采用MVP设计架构。
    关于MVC,MVP,MVVM设计模式的升级改造做如下说明:

    MVC模式:
    M 指模型层(网络IO、文件IO等操作)
    V 指视图层(对应Android中的Layout和Activity/Fragment)
    C 指控制层(对应Android中的Activity/Fragment)

    在Android中,Activity/Fragment既充当控制层又充当视图层,这就导致了V和C这两层耦合在一起,当业务比较复杂时,Activity/Fragment文件就很庞大,导致难以维护和测试,于是MVP模式便应用而生。

    MVP模式:
    M 指模型层(同MVC)
    V 指视图层(同MVC)
    P 指业务层(业务逻辑)

    Activity/Fragment只充当视图层,不做任何的业务逻辑,将业务逻辑全部放在业务层,由Presenter和Model进行交互,避免Model直接操作View。MVP的优点:将业务从Activity/Fragment分离,便于后期维护和测试。MVP使用特点是面向接口编程(View/Presenter/Model都定义一套接口)。可以说MVP模式的出现主要是将MVC中Control控制层进行解耦,View-视图层中需要展示数据则通过Present-业务层调用Model-模型层去获取,Present-业务层拿到数据后以接口形式回传给View-视图层View-视图层只需要注册监听Present-业务层用于更新View-视图层的接口就行了。

    关于MVC和MVP的区别,大家可以参考 Android中MVC/MVP模式区别 ,里面介绍的很清楚,简单易懂。

    有了MVP就够了,为什么又出来了一个MVVM呢?
    关于MVP和MVVM模式的区别,网上资料多而杂,看过一圈之后,你可能会感觉更晕了。这个时候你可以继续往下看我的总结。

    MVC和MVVM的唯一区别就是MVVM中多了一个DataBinding,其他基本无差别。
    DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。MVVM 相对于 MVP,其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中。

    关于DataBinding框架你可以参考 Android DataBinding 从入门到进阶,但是我没有在项目中使用。尝试用了一下,发现不好用。

    原因如下:
    第一条,DataBindding优势在于支持数据绑定(单向和双向),这意味着MVP模式中Present-业务层通过接口回调的方式来通知View-视图层来进行界面更新操作流程不存在了,取而代之的是通过标签绑定的形式来进行更新。如此,layout.xml中可能会进行一些简单的业务逻辑处理。虽然是简单的业务逻辑,我还是感觉和我们一致提倡的视图&&业务分离的理念相悖。

    第二条,.使用DataBinding不方便维护。我曾尝试将MVP模式的项目代码改为DataBinding+MVVM的实现方式。结果很是不爽。举个例子,在使用DataBinding设置监听事件的时候,对点击事件的引用是不会进行错误提示的,一旦你定义的名字和实际引用的存在大小写不匹配的情况,很难排查出错点。Android IDE对代码补全的支持还不是很友好。

    3.使用DataBinding的使用率不是很高。别的我不知道,我身边的人也仅限于了解过活着写过简单的Demo去学习其用法。但是实际项目中没有用到。因此使用DataBinding的话还需谨慎,如果多人维护同一个项目的话,那么大家都会DataBinding的使用,不然日后维护绝对是个坑。

    4.网上介绍的关于DataBinding的用法的介绍,我不想吐槽。好多都是直接复制粘贴过来的,都是些基本的不能再基本的用法,高级用法介绍的很少。有些连基本用法都没讲清楚。比如,我们经常在layout.xml中来使用include来进行布局的复用(虽然不能减少层级嵌套),但是在include中的Layout中使用clickListener的时候,需要由父布局层层传递下去,才能起作用。但是这种很重要的用法,有些文章连提都没提。

    算了,不吐槽了。不然该有小伙伴拿“存在即合理”来反驳我了。

    当项目界面比较复杂控件比较多的时候,可能会需要写大量的findById(R.id.xxx),如果你看着别扭的话,可以使用开源库Butterknife(黄油刀)来进行替换。不一定要使用DataBindding。算了,你们还是自己回头在实际项目中用一下吧,如果你们觉得好用,麻烦告诉我以下,我们再交流交流。

    如果对于MVC/MVP设计架构不清楚的话,推荐大家阅读:
    Android App的设计架构:MVC,MVP,MVVM与架构经验谈,文章中有段话说的特别好:

    刚开始理解这些概念的时候认为这几种模式虽然都是要将view和model解耦,但是非此即彼,没有关系,一个应用只会用一种模式。后来慢慢发现世界绝对不是只有黑白两面,中间最大的一块其实是灰色地带,同样,这几种模式的边界并非那么明显,可能你在自己的应用中都会用到。实际上也根本没必要去纠结自己到底用的是MVC、MVP还是MVVP,不管黑猫白猫,捉住老鼠就是好猫。

    通俗表述就是,不要刻意的是自己的代码故意去迎合某种设计模式,而是通过这种"视图&&业务逻辑解耦"的思想去引贯穿和引导自己去写代码。

     

    2.屏幕适配

    在这里插入图片描述
    前面受限于截图,特此将values/dimens.xml文件展开如上图。android项目开发,屏幕适配是首先要考虑的问题关于屏幕适配,大家可参照另一篇文章:
    Android 屏幕适配方案
     

    3.程序启动页

    AndroidMantifest.xml

    ...
    
            <activity
                android:name=".ui.activity.HRSplashActivity"
                android:theme="@style/SplashTheme"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    ...
    
      <!-- Base application theme. -->
        <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">#00FFFF</item>
            <item name="colorPrimaryDark">#FFFFFF</item>
            <item name="colorAccent">#FFFF00</item>
            <item name="android:windowBackground">@mipmap/startup</item>
            <item name="android:windowActionBar">false</item>
            <item name="android:windowNoTitle">true</item>
        </style>
    

    上述中的

     <item name="android:windowBackground">@mipmap/startup</item>
    

    就是启动页的图。
     
    HRSplashActivity.java

    public class HRSplashActivity extends FragmentActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          //todo:可在此处添加关于启动页面的延时操作eg(延时2s): 
          try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            startActivity(new Intent(HRSplashActivity.this, HRLoginActivity.class));
            finish();
        }
    
    }
    
    

     

    4.运行权限获取

    正常情况下程序运行的流程图下:
    启动页----->登录页----->程序首页
    没错,但是在从启动页跳转到登录页的时候,涉及到权限授予,主要是针对Android 6.0权限的授予。也许你会问,我在用到权限的时候再申请不行么? 答案是:可以,但是不建议。如果如果只有少量界面需要申请权限,即用即申请是可以的。但是如果需要权限的界面很多,这就比较麻烦了-------我们需要在每个界面都要判断所需权限是否已经授予了,如果没有的话就继续申请。权限申请逻辑比较分散,不便于后续维护。

    因此最好的办法就是在程序开启时就要进行权限申请,如果所需权限没有全部被授予**(记住:所需权限必须全部被授予)**,就不允许用户登录。事实上QQ就是这么做的,当权限被用户手动拒绝之后,会弹出提示框,从而引导用户去设置中手动设置。

    废话不说,直接贴出权限工具类,这个工具类其实还有些别的权限相关的方法,怕影响阅读,我把它阉割掉了,如果想看完整的,也可移步
    Android常用的工具类汇总(方便日后使用)
    PermissionUtils .java

    public final class PermissionUtils {
    
        /**
         * Return whether <em>you</em> have granted the permissions.
         *
         * @param permissions The permissions.
         * @return {@code true}: yes<br>{@code false}: no
         */
        public static boolean isGranted(final String... permissions) {
            for (String permission : permissions) {
                if (!isGranted(permission)) {
                    return false;
                }
            }
            return true;
        }
    
        private static boolean isGranted(final String permission) {
            return Build.VERSION.SDK_INT < Build.VERSION_CODES.M
                    || PackageManager.PERMISSION_GRANTED
                    == ContextCompat.checkSelfPermission(Utils.getApp(), permission);
        }
    
        /**
         * Launch the application's details settings.
         */
        public static void launchAppDetailsSettings() {
            Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.parse("package:" + Utils.getApp().getPackageName()));
            Utils.getApp().startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
        }
    
        /**
         * 批量申请权限(如果当前没有权限的话)。授权结果在onRequestPermissionsResult中处理
         */
        public static void requestPermissionsIfNeed(Activity activity, String[] perms, int requestCode) {
            if (perms.length == 0) {
                return;
            }
    
            HashSet<String> needPerms = new HashSet<>();
            for (String perm : perms) {
                if (!isGranted(perm)) {
                    needPerms.add(perm);
                }
            }
    
            if (needPerms.size() == 0) {
                return;
            } else {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    activity.requestPermissions(needPerms.toArray(new String[needPerms.size()]), requestCode);
                }
            }
        }
    
    }
    

    上述保留了最基本的权限申请逻辑,完全能满足需求。

    至于怎么在程序入口处调用,很简单,看程序入口。
    HRLoginActivity.java

    public class HRLoginActivity extends HRBaseActivity implements View.OnClickListener {
    
        private final int PERMISSION_REQUEST_CODE = 0x183;
        private final String perms[] = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.MODIFY_AUDIO_SETTINGS,
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.CAMERA,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CHANGE_NETWORK_STATE
        };
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestPermissions();
            ....
            ....
            ....
        }
    
        private void requestPermissions() {
            PermissionUtils.requestPermissionsIfNeed(this, perms, PERMISSION_REQUEST_CODE);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.login_confirm:
                    if (PermissionUtils.isGranted(perms)) {
                        login();
                    } else {
                        requestPermissions();
                    }
                    break;
    
                default:
                    break;
            }
        }
    
        /**
         * 某一权限没有被授予,弹出提示框
         */
        private void showPermissionDialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this)
                    .setTitle("温馨提示")
                    .setMessage("请在设置中开启所需权限,以正常使用xxx功能")
                    .setNeutralButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            finish();
                        }
                    })
                    .setNegativeButton("去设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            PermissionUtils.launchAppDetailsSettings();
                            finish();
                        }
                    });
    
            final AlertDialog dialog = builder.show();
            dialog.setCanceledOnTouchOutside(false);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode != PERMISSION_REQUEST_CODE) {
                return;
            }
    
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    showPermissionDialog();
                    return;
                }
            }
        }
    
    }
    
    

    逻辑很简单:如果权限没授予,就弹出提示框,引导用户去“设置”中手动授予权限,如果在弹框中点击“取消”,则退出程序。下次进来,依旧如此,直至所有权限全部被授予。

     
    好了,先到这吧,下面的3条将会在下一篇 Android项目框架搭建(二) 中进行介绍。

    5.基类(BaseActivity/BaseFragment/BaseApplication)
    6.Retrofit(最流行的网络请求框架)+RxJava(链式编程风格+异步)
    7.程序崩溃界面处理

    请先让我酝酿一下。

     
     
     
    附上链接:
    Android项目框架搭建(二)

    展开全文
  • Android项目实战--手机卫士完整源码part1

    千次下载 热门讨论 2014-01-14 14:27:33
    Android项目实战--手机卫士完整源码part1
  • 几个比较好的Android项目源码

    千次下载 热门讨论 2013-09-02 20:22:28
    几个比较好的Android项目源码,非常适合Android进阶,因为是从网上收集起来的,所以设置成不需要资源分
  • 实用的android项目框架

    热门讨论 2014-07-17 11:26:00
    1.自定义android项目底部任务栏 2.实用Fragment切换 3.项目整体架构
  • android项目详细设计说明书

    热门讨论 2011-07-13 23:53:54
    这里是在android项目开发中,所用到的详细设计说明书模板。
  • android项目中读取ini配置文件

    热门讨论 2012-11-21 09:46:32
    将ini文件存在android项目中assets文件夹中,以便于软件开启时自动读取ini系统配置文件。
  • 项目版本:android4.0 AVD建议:android4.4及以上 文章目录 博学谷项目的欢迎界面由RealativeLayout布局和TextView控件组成,其中RealativeLayout的背景图片用于展示产品Logo,TextView控件用于展示程序版本号。 ...
    本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助😘😘
    项目版本:android5.1.1
    AVD建议:android4.4.2及以上

    BoXueGu源码资源下载链接:
    https://download.csdn.net/download/hyh/19477319


    BoXueGu图片资源下载(免费):
    https://yuyunyaohui.lanzoui.com/iWos0pyc4rc


    博学谷项目的欢迎界面主要展示产品Logo和版本信息,本项目设置欢迎界面暂停3秒后再跳转

    欢迎界面的效果图如图所示:

    在这里插入图片描述

    1.创建项目

    首先创建一个工程,将其命名为BoXueGu,指定包名为china.ynyx.heyunhui。具体步骤请看:怎样用eclipse新建一个android项目?
    在这里插入图片描述

    2.导入界面图片(项目图片请加关注私聊我)

    在res下新建一个drawable文件夹,将需要的背景图片register_bg.jpg导入该文件夹中

    3.创建欢迎界面布局文件

    在res目录下的layout文件夹新建一个activity_splash.xml文件。右击并选择“New”–“other”–“android”–“Android XML File”
    在这里插入图片描述
    具体代码:activity_splash.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/launch_bg" ><!-- 将布局背景设置成欢迎图片 -->
        
        <!-- TextView控件用于显示版本号信息-->
        <TextView 
            android:id="@+id/tv_version"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="@android:color/white"
            android:textSize="14sp"/>
        <!--android:layout_centerInParent="true"属性将TextView置于父控件的中心位置-->
    
    </RelativeLayout>
    

    4.欢迎界面的逻辑代码

    在src目录下新建类SplashActivity.java文件,选中项目右击并选择“New”→“class”
    在这里插入图片描述
    具体代码如下:SplashActivity.java

    package china.ynyx.heyunhui.activity;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.support.v7.app.AppCompatActivity;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.widget.TextView;
    import china.ynyx.heyunhui.MainActivity;
    import china.ynyx.heyunhui.R;
    
    public class SplashActivity extends AppCompatActivity{
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_splash);
    		//设置此界面为竖屏
    		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    		init();
    	}
    
    	private void init() {
    		// TODO Auto-generated method stub
    		TextView tv_version=(TextView)findViewById(R.id.tv_version);
    		try {
            	//获取程序包信息
                PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0);//getPackageManager()获取设备安装应用程序包对象
                // getPackageInfo:根据包名获取此处flag标签
                tv_version.setText("V" + info.versionName);//程序版本信息
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                tv_version.setText("V");
            }
            //利用timer让此界面延迟3秒后跳转,timer有一个线程,这个线程不断执行task
            Timer timer=new Timer();//Timer类是JDK中提供的一个定时器功能,使用时会在主线程之外开启一个单独的线程执行指定任务,任务可以执行一次或者多次
            //TimerTask实现runnable接口,TimerTask类表示在一个指定时间内执行的task
            TimerTask task=new TimerTask() {
            	@Override
            	public void run() {//跳转主界面的任务代码写在TimerTask的run()方法中
                    Intent intent=new Intent(SplashActivity.this,MainActivity.class);
                    startActivity(intent);
                    SplashActivity.this.finish();
            	}
            };
            timer.schedule(task,3000);//timer.schedule用于开启TimerTask类 传递两个参数,第一个参数为TimerTask的对象,第二个参数为TimerTask和run()之间的时间差为3秒。
            //设置这个task在延迟3秒后自动执行
    	}
    }
    
    

    5.修改清单文件AndroidManifest.xml

    去掉程序默认标题栏:

    android:theme="@style/Theme.AppCompat.NoActionBar"
    

    设置欢迎界面指定为程序默认启动界面:

    	<activity
    		android:name="china.ynyx.heyunhui.activity.SplashActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    

    .MainActivity换成china.ynyx.heyunhui.activity.SplashActivity,然后下面再将MainActivity注册:<activity android:name="china.ynyx.heyunhui.MainActivity"></activity>

    具体代码:AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="china.ynyx.heyunhui"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="28" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.NoActionBar">
            <activity
                android:name="china.ynyx.heyunhui.activity.SplashActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="china.ynyx.heyunhui.MainActivity"></activity>
        </application>
    
    </manifest>
    
    

    参考资料:《android项目实战——博学谷》(黑马程序员著)


    基于eclipse的android项目实战—博学谷(一)欢迎界面
    基于eclipse的android项目实战—博学谷(二)注册界面
    基于eclipse的android项目实战—博学谷(三)登录界面
    基于eclipse的android项目实战—博学谷(四)底部导航栏
    基于eclipse的android项目实战—博学谷(五)“我”的模块
    基于eclipse的android项目实战—博学谷(六)设置界面
    基于eclipse的android项目实战—博学谷(七)修改密码
    基于eclipse的android项目实战—博学谷(八)设置密保和找回密码
    基于eclipse的android项目实战—博学谷(九)个人资料界面
    基于eclipse的android项目实战—博学谷(十)个人资料修改
    基于eclipse的android项目实战—博学谷(十一)习题界面
    基于eclipse的android项目实战—博学谷(十二)习题详情界面
    基于eclipse的android项目实战—博学谷(十三)水平滑动广告栏界面
    基于eclipse的android项目实战—博学谷(十四)课程界面
    基于eclipse的android项目实战—博学谷(十五)课程详情界面
    基于eclipse的android项目实战—博学谷(十六)视频播放界面
    基于eclipse的android项目实战—博学谷(十七)播放记录界面
    基于eclipse的android项目实战—博学谷(十 八)播放不同视频(网络视频)
    基于eclipse的android项目实战—博学谷(十 九)播放不同视频(本地视频)

    展开全文
  • 纯flutter项目上线风险还是比较大,所以跨平台的混合开发模式自然还是现阶段尝试flutter的主流方式,今天的分享我就跟大家一块把我们写好的flutter项目打包成aar文件嵌入到现有的Android项目中去。 课程目标 ...
  • 安装环境: window 10 64位 安装工具: JDK、Eclipse、SDK、ADT ...5. 创建第一个Android项目 1.JAVA JDK下载安装 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/i...
  • 第一步,打开eclipse,配置好安卓开发环境(不然找不到新建android项目的地方哦)2.新建Android程序有多种方法:3.哦豁,弹出一大片错误,没关系,将下图窗体关闭 今天突然发现好多小伙伴用eclipse新建android项目...
  • 在Android Studio本地运行GitHub上的开源Android项目

    万次阅读 多人点赞 2018-11-20 17:38:42
    文章目录背景下载项目的zip包解压到本地删除项目中原开发者的机器环境,替换为自己的机器环境在Android Studio中运行这个开源项目运行图示 背景 原来项目需要用gitlab进行版本管理。我需要先把gitlab上的项目在本地...
  • 在Android Studio创建第一个Android项目

    千次阅读 2018-11-14 21:56:55
    Android Studio 欢迎界面点击Start a new Android Studio projeect,点击完会出现创建项目界面。 然后在Application name 处填写工程名称(应用安装到手机上也会显示此名称),Company Domain 表示公司域名,...
  • 项目版本:android4.0 AVD建议:android4.4及以上 文章目录 登录界面主要用于输入登录信息,当点击“登录”按钮时需要在 Shared Preferences中查询输入的用户名是否有对应的密码,如果有则用此密码与当前输入的密码(需...
  • Android项目升级AndroidX

    万次阅读 2019-08-29 10:22:35
    强烈建议:把项目升级到AndroidX一定一定要新建分支来操作,不然升级不了(使用的某些第三方还没有支持android等其他情况),可是又回不原先的项目,就…… 1.gradle下修改Version 若是模块化,强烈建议用config...
  • 以前公司的老项目,是使用eclipse进行开发的,虽然android studio出来了很久,但为了避免迁移会有一些问题,一直忍着没改,但最近谷歌公司上架有要求,要求android项目要用android 8.0来编译,然后就发现eclipse+ADT已经...
  • 一、项目分析 1、项目名称 WordPress建站APP 2、项目概述 WordPress建站是一个学习博客建站技术的APP,主要讲述WordPress建站过程。APP基于黑马程序员的博学谷自学助手项目进行开发和创新。是移动高级开发课程的学生...
  • Android项目创建 1. Android基本常识 1.1 Android系统架构 Linux内核层 Android系统是基于Linux内核的,为Android设备硬件提供底层驱动 系统运行层 C/C++库为Android系统提供特性支持 Android运行时库,包含ART...
  • IDEA开发及运行第一个Android项目

    千次阅读 2020-04-15 21:48:52
    新建项目 提示安装SDK 等待下载完成 继续建项目 选择手机或平板及目标设备API版本 选择空项目 启动activity 等待SDK平台版本下载完成 项目新建完成。开始配置 点Setup SDK 选择SDK 或者 File-Project Structure ...
  • Android项目分包(按功能模块)

    千次阅读 2019-08-09 15:54:42
    分包是一个开放性的问题,它并没有固定或最优的方案,但是不好的分包策略带来的影响将会一直持续在App的开发迭代周期中,给开发带来一定的麻烦:如:耦合性 ,不易维护,重用难度高 下面介绍一下一种分包策略(按...
  • idea运行android项目

    千次阅读 2019-11-12 09:25:50
    idea运行android项目 ...
  • android 项目迁移到 AndroidX

    千次阅读 2019-07-25 12:54:45
    使用 Android Studio 迁移现有项目 借助 Android Studio 3.2 及更高版本,您可以通过从菜单栏中依次选择Refactor > Migrate to AndroidX,快速迁移现有项目以使用 AndroidX。 如果您有任何尚未迁移至 AndroidX ...
  • 目录 环境 创建项目 运行第一个项目-HelloWorld 环境 ... Android Studio 所有SDK已经...1. 第一次运行的时候其实就会创建一个项目,这里在仔细记录一下,首先打开创建新新项目的页面: 上面可以选择的类型有...
  • 给大家分享几个Android开发项目源码,大部分功能相信可以在实战项目中直接使用,供大家下载学习,大部分项目是基于 AndroidStudio开发,IDE为Eclipse的童鞋可通过网上教程自行转换,这里就不多说了。 源码项目一:...
  • android项目引入flutter moudle依赖步骤

    千次阅读 2019-03-08 14:55:27
    第二步,在new Flutter Project 选择 flutter module模式,路径和android项目MyApp同级目录,并建议在new window 窗口打开 ,也就是说Android工程和Flutter工程是同级的,只是Android项目是正常创建,Flutter项目是...
  • Android项目——新闻APP(源码)

    热门讨论 2019-02-26 19:40:11
    Android项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/article/details/80992341
  • Android Studio3.5.2,新建项目都是默认AndroidX,想改成android项目,改动如下所示: 一.gradle.properties(Project Properties),改成如下: android.useAndroidX=false android.enableJetifier=false 二....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 664,909
精华内容 265,963
关键字:

android项目