zoukankan      html  css  js  c++  java
  • android开发-java

    环境篇【】

    初始化环境可以看看这里http://c.biancheng.net/view/2899.html

    我就只提出我遇到的问题

     尝试 ,没用

    后发现代理问题

    打开C:UsersE.gradle下面的gradle.properties文件: systemProp.https.proxyPort=80 systemProp.http.proxyHost=mirrors.neusoft.edu.cn systemProp.https.proxyHost=mirrors.neusoft.edu.cn systemProp.http.proxyPort=80 原来我之前设置过代理。全部注释掉!

    依赖慢的话就

    //        mavenCentral()//        jcenter()//        google()

              maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }

              maven { url 'https://maven.aliyun.com/repository/google' }

              maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }

              maven { url 'https://maven.aliyun.com/repository/jcenter'}

    建议多看看官方给出的代码:https://developer.android.google.cn/samples?language=java

    看看基础:http://c.biancheng.net/android/

    以下是我ode学习总结

    java先定义再声明,利用findViewById找到按钮的id值再强制转换类型,过后设置方法onclick

    这样就可以通过不同的btn_id来跳转不同的页面

     

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button btn = (Button) this.findViewById(R.id.button1);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //TODO Auto-generated method stub
                    setTitle("button1 被用户点击了");
                    Log.i("widgetDemo", "button1 被用户点击了。");
                }
            });
        }
    }

     

    多个时

     

     

    这里的OnClick就是一个listener的名字而已,主要是实现view.onclickListener的onclick方法

     

    intent的参数.class这个就是java的类,在kotlin里也是一样的这样写.class,即activity本就是java的类。 

     

     

     然后就是一些基本常见的组件和GUI的开发步骤

    难点是适配器

     

    https://www.jianshu.com/p/4e8e4fd13cf7详细出自这

    • ListView仅作为容器(列表),用于装载 & 显示数据(即 列表项Item)
    • 而容器内的具体数据(列表项Item)则是由 适配器(Adapter)提供

    适配器(Adapter):作为View 和 数据之间的桥梁 & 中介,将数据映射到要展示的View中

    • 当需显示数据时,ListView会向Adapter取出数据,从而加载显示,具体如下图

    试想一个场景:若把所有数据集合的信息都加载到ListView上显示,若 ListView要为每个数据都创建一个视图,那么会占用非常多的内存

    为了节省空间和时间,ListView不会为每一个数据创建一个视图,而是采用了Recycler组件,用于回收 & 复用 View

    当屏幕需显示x个Item时,那么ListView会创建 x+1个视图;当第1个Item离开屏幕时,此Item的View被回收至缓存,入屏的Item的View会优先从该缓存中获取

    注:

    1. 只有Item完全离开屏幕后才可复用,这也是为什么ListView要创建比屏幕需显示视图多1个的原因:缓冲 显示视图
    2. 即:第1个Item离开屏幕是有过程的,会有1个 第1个Item的下半部分 & 第8个Item上半部分同时在屏幕中显示的状态,此时仍无法使用缓存的View,只能继续用新创建的视图View

     

    而这个重写的方法参数中第一个参数有一个parent

    position是指当前dataset的位置,通过getCount和getItem来使用。如果list向下滑动的话那么就是最低端的item的位置,如果是向上滑动的话那就是最上端的item的位置。conert是指可以重用的视图,即刚刚出队的视图。

    而parent应该就是list。

    parent:parent相当于listview适配器的一个指针,可以通过它来获得listview里装着的一切东西,简单说就是所使用的list容器,例如ListView、GridView。通过强制类型转换可以将parent转换为对应的list容器。然后通过转换得到的list对象调用getAdapter()方法获得适配对象,通过适配对象就可以获得所展示的每一项的对象model。

    例:ListView listView = (ListView) parent;

    ListAdapter listAdapter = listView.getAdapter();

     

    而简单的view是你点的b这个view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件。就是可以使用 view.findViewById()方法来获取所点击item中的控件

     

     

    接上

    activity里,找到想使用的id并需要转类型,此时的mLv1就是一个listview

    写出mLv1.点就能看到里面 有哪些方法,其中就有经常用的setAdapter方法,并且可以看到方法参数为adapter,所以可以就可以在另一个class中再写一个adapter

    在同包的下面另一个class中再写一个adapter,继承baseadapter即可,先学这个基础的,

    BaseAdapterAndroid应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListViewSpinnerGalleryGridViewUI显示组件,

    它是继承自接口类Adapter,我们经常使用的ListView adapter,即SimpleAdapter,是继承自BaseAdapter的,BaseAdapter是一个基类,没有实现绑定数据的功能,

    SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。

    使用BaseAdapter的话需要重载四个方法,这些方法分别是getCountgetItemgetItemId,最后一个最重要的是getViewgetView函数为什么重要呢?

    因为它是用来刷新它所在的ListView的。它在什么时候调用的呢?就是在每一次item从屏幕外滑进屏幕内的时候,或者程序刚开始的时候创建第一屏item的时候。

     

     

    还可以点击baseAdapter看看里面的方法,方便我们重写,因为继承嘛

    点击他然后ctrl+鼠标左键还是右键点击进去,

     

    再点 接口implements 里的一些接口进去到看到Adapter类的基本方法

    extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 

     extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承也可以调用父类初始化 this.parent()。而且会覆盖父类定义的变量或者函数。

    这样的好处是:架构师定义好接口,让工程师实现就可以了。整个项目开发效率和开发成本大大降低。  

     implements,实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。  

    点击继承 实现implement接口方法就会@Override几个方法

    然后写一个构造方法传参

    LayoutInflater--相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的。而刚接触Android的朋友可能对LayoutInflater不怎么熟悉,

    因为加载布局的任务通常都是在Activity中调用setContentView()方法来完成的。其实setContentView()方法的内部也是使用LayoutInflater来加载布局的,

    只不过这部分源码是internal的,不太容易查看到。它的作用类似于findViewById()。

    不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;

    而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

    如何调用在下面 ,现在只是声明。

     

    context

    Context到底是什么呢?一个Activity就是一个Context,一个Service也是一个Context。Android程序员把“场景”抽象为Context类,他们认为用户和操作系统的每一次交互都是一个场景,

    生动形象的理解Context(来自网络)

    上面的概念中采用了通俗的理解方式,将Context理解为上下文或者场景,如果你仍然觉得很抽象,不好理解。在这里给出一个可能不是很恰当的比喻,希望有助于大家的理解:

    一个Android应用程序,可以理解为一部电影或者一部电视剧,ActivityServiceBroadcast ReceiverContent Provider这四大组件就好比是这部戏里的四个主角:胡歌,霍建华,诗诗,Baby

    他们是由剧组(系统)一开始就定好了的,整部戏就是由这四位主演领衔担纲的,所以这四位主角并不是大街上随随便便拉个人(new 一个对象)都能演的。

    有了演员当然也得有摄像机拍摄啊,他们必须通过镜头(Context)才能将戏传递给观众,这也就正对应说四大组件(四位主角)必须工作在Context环境下(摄像机镜头)。

    ButtonTextViewLinearLayout这些控件呢,就好比是这部戏里的配角或者说群众演员,他们显然没有这么重用,随便一个路人甲路人乙都能演(可以new一个对象),

    但是他们也必须要面对镜头(工作在Context环境下),所以Button mButton=new ButtonContext是可以的。虽然不很恰当,但还是很容易理解的,希望有帮助。

     

    助。

     

    理解完上述之后 重写ovrrid方法,其他可以不写,但写一个方便理解

     

    getcoun方法t写一个 return 10

     

    重点重写的getview方法

    首先参数里就知道需要一个view converview

    这个convertView其实就是最关键的部分  原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 
    这时候Android会回收这个条目的view 这个view也就是这里的convertView

    当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new
    而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销

    所以就用到了layoutInflaterinflate加载这个layoutxml(才能实现这个view即view converview)。然后就可以一个一个找到里面的id赋给对应的初始值holder

    然后传给convertview。 这个类myadapter就写完了

    当然还可以选择自己赋值,看选可不选,不选的话就是加载xml layout里面的

    text这些。

    然后回到listviewActivity里的oncreat里使用方法并传参这个自己写的类

    发现提示我们需要context(因为我的类写了一个构造函数传参)。再结合我们上面的context解析可以理解应该这样

    发现可以拖动,有10行 ,因为设置的count 10

    在这里我们并没有设置listviewitem等其他方法所以10个全是一样的

    其实在这里是可以看到的Listviewitem1 2 3等,在getItem方法可以重写,并且点击第几时又跳转到哪这些又需要一些新函数,如

    listView.setOnItemClickListener(new OnItemClickListener(){

    @Override

    public void onItemClick(AdapterView<?> parent, View view,

    int position, long id) {

    这些方法

    也可以这样写

    定义列表数组资源作为列表各项

    然后添加到listViewentries中,图中可以看到已经加载为@array/options

    然后添加单击事件相应,

     

     

     再看看RecylerView_java项目(全为各种adapter的演示)

     

    这里面需要注意就是

     

    首先是recyclerview的配置问题,recyclerview是要导入android.support.v7.widget.RecyclerView的包。还要在Gradle Scripts中添加 compile ‘com.android.support:recyclerview-v7:23.4.0’,然后同步。
    2.使用RecyclerView实现的主要是内容是Item的添加和删除以及ListView,GridView和瀑布流的切换,还有就是Item的长按和短按的点击事件。

     

    ListView和GridView的切换还是很好用,代码也很简单。主要是实现了以下代码。

     

    /**
    *这是ListView的效果
    */
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
    /**
    *这是GridView的效果
    */
    recyclerView.setLayoutManager(new GridLayoutManager(this, 2));

    只需要改一行代码就能实现GridView和ListView的切换!!

     看一下这里的一个adapter

    public class linearAdapter extends RecyclerView.Adapter <linearAdapter.linearViewHolder>{
        @NonNull
    
        private Context mContext;
        public linearAdapter(Context context){
    
            this.mContext = context;
    
        }
        @Override
        public linearAdapter.linearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //这里需要一个Context所以定义一个context再在构造方法中实现
            return new linearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));
    
        }
    
        @Override
        public void onBindViewHolder(@NonNull linearAdapter.linearViewHolder holder, final int position) {
            holder.textView.setText("hello world!");
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext,"clicked....."+position,Toast.LENGTH_SHORT).show();
                }
            });
    
        }
    
        @Override
        public int getItemCount() {
            return 30;
        }
        class linearViewHolder extends RecyclerView.ViewHolder{
            private TextView textView;
    
            public linearViewHolder(@NonNull View itemView) {
                super(itemView);
                textView=(TextView)itemView.findViewById(R.id.tv_title);
            }
        }
    }

     onCreateViewHolder()负责为Item创建视图,onBindViewHolder()负责将数据绑定到Item的视图上。

     

     

     

    web加载html或者网页网址等为当前activity

    下面的class是自己写一个web客户端,可以不自己写

    调用默认的

    页面的显示隐式跳转

     

     

     

    传参2、打开新的Activity并传递参数

    MainActivity.java传递参数

    public void OpenNew(View v){
        //新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类
        Intent intent =new Intent(MainActivity.this,MainActivity2.class);
        
        //用Bundle携带数据
        Bundle bundle=new Bundle();
        //传递name参数为tinyphp
        bundle.putString("name", "tinyphp");
        intent.putExtras(bundle);
        
        startActivity(intent);        
        }

    MainActivity2.java接收参数

     

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.newtest);   
            
            //新页面接收数据
            Bundle bundle = this.getIntent().getExtras();
            //接收name值
            String name = bundle.getString("name");
           Log.i("获取到的name值为",name);     
        }  

     

    搞不清楚Bundlehttps://blog.csdn.net/randyjiawenjie/article/details/6651437

     

    在项目camera中还有一种传参可参考。/                    在启动摄像头程序时,因为要传回拍摄的图像,所以调用了
    //                Activity.startActivityForResult(Intent intent, int requestCode) 方法。
    //                    当 startActivityForResult() 方法启动的 Activity 正常结束时,
    //                    会自动返回发出请求的 Activity,
    //                    并且该方法会返回对应的 requestCode 值给
    //                onActivityResult(int requestcode, int resultCode,Intent data) 方法,
    //                    借此可以在请求 Activity 和发出请求的 Activity 之间进行数据传递。
    //                    本实例借助于这一特点传回了 Android 系统照相机程序拍摄的照片。

     

    https://blog.csdn.net/MonaLisaTearr/article/details/79643048

    Bitmap参考这里https://blog.csdn.net/MonaLisaTearr/article/details/79643048

    和这里http://c.biancheng.net/view/3039.html

  • 相关阅读:
    Conference deadlines
    waiting list
    BDA3 Chapter 1 Probability and inference
    PP: Articial Intelligence—TheRevolution Hasn’t HappenedYet
    兼容ie9文件上传,及现代浏览器实现进度条
    input 打开文件夹事件委托
    前端构建工具gulpjs的使用介绍及技巧
    如何编写兼容各主流邮箱的HTML邮件
    前端通用框架可行性研究报告之弹窗
    切换tab键,不聚焦a标签
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/13124224.html
Copyright © 2011-2022 走看看