精华内容
下载资源
问答
  • Android笔记

    2014-09-21 20:01:13
    一些散乱的Android笔记
  • android笔记全集

    2018-07-12 21:10:58
    android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集android笔记全集...
  • android笔记

    2014-03-11 23:43:12
    这是一个很详细的android笔记 是黑马 张老师讲课的笔记
  • Android笔记:Android开发核心知识点笔记(不断更新中:fire:)
  • Android教程,谢彦,android笔记 2010年谢彦的android笔记.pdf,内容方面:Android系统配置、基本概念、程序开发、一些Android小程序的开发与讲解、Android开发层的架构分析等内容,上述的每一项内容都细分有许多章节...
  • java4Android笔记全集

    2014-10-29 23:03:58
    java4Android笔记全集适合看过视频后慢慢复习
  • Android笔记:适用于Android的文章,笔记,面试问题和资源管理
  • unity导出到android笔记.pdf unity导出到android笔记.pdf
  • android笔记初学者必看

    2014-12-24 11:34:23
    android笔记初学者必看 包含代码和知识要点 为求职做好充分准备
  • 第一行代码 android学习笔记 修改完整版
  • Android笔记、便签一览

    2018-11-08 16:17:42
    Android笔记、便签一览1. 锤子便签2. WPS便签3. 便签4. 易码5. 为知笔记6. 印象笔记7. 有道云笔记8. 石墨文档9. Zine10. 蚂蚁笔记11. 墨者写作12. 纯纯写作13. 简笔记未完,待续 1. 锤子便签 2. WPS便签 3. 便签 ...

    1. 锤子便签

    2. WPS便签

    3. 便签

    不要怀疑,它就叫便签

    4. 易码

    5. 为知笔记

    6. 印象笔记

    7. 有道云笔记

    8. 石墨文档

    9. Zine

    10. 蚂蚁笔记

    11. 墨者写作

    12. 纯纯写作

    13. 简笔记

    未完,待续

    展开全文
  • Android笔记之 图片自由裁剪 DEMO

    热门讨论 2014-05-26 20:45:00
    Android笔记之 图片自由裁剪 DEMO,用相机或者相册来选择照片,然后用谷歌开发自带的裁剪功能来裁剪,然后显示。
  • Android笔记:Socket客户端收发数据

    千次阅读 2018-08-22 21:29:38
    client.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:
    原文地址为:
    Android笔记:Socket客户端收发数据
    

    client.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
    ="match_parent"
    android:layout_height
    ="match_parent"
    android:orientation
    ="vertical" >

    <TextView
    android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:layout_centerHorizontal
    ="true"
    android:layout_centerVertical
    ="true"
    android:text
    ="接收到的信息" />

    <TextView
    android:id="@+id/tv1"
    android:layout_width
    ="150dp"
    android:layout_height
    ="wrap_content"
    android:layout_centerHorizontal
    ="true"
    android:layout_centerVertical
    ="true"
    android:layout_weight
    ="0.25"
    android:text
    ="" />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:layout_centerHorizontal
    ="true"
    android:layout_centerVertical
    ="true"
    android:text
    ="请输入发送内容" />

    <EditText
    android:id="@+id/editText1"
    android:layout_width
    ="match_parent"
    android:layout_height
    ="wrap_content"
    android:ems
    ="10" >

    <requestFocus />
    </EditText>

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height
    ="wrap_content" >
    <Button
    android:id="@+id/button1"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="发送" />
    <Button
    android:id="@+id/button2"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="设置" />

    </LinearLayout>



    </LinearLayout>

    client.java

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.SocketException;
    import java.net.UnknownHostException;

    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    public class Client extends Activity {
    private String TAG = "===Client===";
    private String TAG1 = "===Send===";
    private TextView tv1 = null;
    Handler mhandler;
    Handler mhandlerSend;
    boolean isRun = true;
    EditText edtsendms;
    Button btnsend;
    private String sendstr = "";
    SharedPreferences sp;
    Button btnSetting;
    private Context ctx;
    Socket socket;
    PrintWriter out;
    BufferedReader in;
    SocThread socketThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.client);
    tv1
    = (TextView) findViewById(R.id.tv1);
    btnsend
    = (Button) findViewById(R.id.button1);
    ctx
    = Client.this;
    edtsendms
    = (EditText) findViewById(R.id.editText1);
    btnSetting
    = (Button) findViewById(R.id.button2);
    mhandler
    = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    try {
    MyLog.i(TAG,
    "mhandler接收到msg=" + msg.what);
    if (msg.obj != null) {
    String s
    = msg.obj.toString();
    if (s.trim().length() > 0) {
    MyLog.i(TAG,
    "mhandler接收到obj=" + s);
    MyLog.i(TAG,
    "开始更新UI");
    tv1.append(
    "Server:" + s);
    MyLog.i(TAG,
    "更新UI完毕");
    }
    else {
    Log.i(TAG,
    "没有数据返回不更新");
    }
    }
    }
    catch (Exception ee) {
    MyLog.i(TAG,
    "加载过程出现异常");
    ee.printStackTrace();
    }
    }
    };
    mhandlerSend
    = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    try {
    MyLog.i(TAG,
    "mhandlerSend接收到msg.what=" + msg.what);
    String s
    = msg.obj.toString();
    if (msg.what == 1) {
    tv1.append(
    "\n ME: " + s + " 发送成功");
    }
    else {
    tv1.append(
    "\n ME: " + s + " 发送失败");
    }
    }
    catch (Exception ee) {
    MyLog.i(TAG,
    "加载过程出现异常");
    ee.printStackTrace();
    }
    }
    };
    startSocket();
    btnsend.setOnClickListener(
    new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 发送数据
    MyLog.i(TAG, "准备发送数据");
    sendstr
    = edtsendms.getText().toString().trim();
    socketThread.Send(sendstr);

    }
    });
    btnSetting.setOnClickListener(
    new OnClickListener() {

    @Override
    public void onClick(View v) {
    // 跳转到设置界面
    Intent intent = new Intent();
    intent.setClass(Client.
    this, Setting.class);
    MyLog.i(TAG,
    "跳转至设置界面");
    ctx.startActivity(intent);
    // 打开新界面

    }
    });

    }

    public void startSocket() {
    socketThread
    = new SocThread(mhandler, mhandlerSend, ctx);
    socketThread.start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.client, menu);
    return true;
    }

    private void stopSocket() {
    socketThread.isRun
    = false;
    socketThread.close();
    socketThread
    = null;
    MyLog.i(TAG,
    "Socket已终止");
    }

    @Override
    protected void onStart() {
    super.onStart();
    Log.e(TAG,
    "start onStart~~~");
    }

    @Override
    protected void onRestart() {
    super.onRestart();
    Log.e(TAG,
    "start onRestart~~~");
    startSocket();
    }

    @Override
    protected void onResume() {
    super.onResume();
    Log.e(TAG,
    "start onResume~~~");
    }

    @Override
    protected void onPause() {
    super.onPause();
    Log.e(TAG,
    "start onPause~~~");
    }

    @Override
    protected void onStop() {
    super.onStop();
    Log.e(TAG,
    "start onStop~~~");
    stopSocket();
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    Log.e(TAG,
    "start onDestroy~~~");

    }

    }

    socket线程:SocThread.java

     

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;

    public class SocThread extends Thread {
    private String ip = "10.0.0.113";
    private int port = 13000;
    private String TAG = "socket thread";
    private int timeout = 10000;

    public Socket client = null;
    PrintWriter out;
    BufferedReader in;
    public boolean isRun = true;
    Handler inHandler;
    Handler outHandler;
    Context ctx;
    private String TAG1 = "===Send===";
    SharedPreferences sp;

    public SocThread(Handler handlerin, Handler handlerout, Context context) {
    inHandler
    = handlerin;
    outHandler
    = handlerout;
    ctx
    = context;
    MyLog.i(TAG,
    "创建线程socket");
    }

    /**
    * 连接socket服务器
    */
    public void conn() {

    try {
    initdate();
    Log.i(TAG,
    "连接中……");
    client
    = new Socket(ip, port);
    client.setSoTimeout(timeout);
    // 设置阻塞时间
    MyLog.i(TAG, "连接成功");
    in
    = new BufferedReader(new InputStreamReader(
    client.getInputStream()));
    out
    = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
    client.getOutputStream())),
    true);
    MyLog.i(TAG,
    "输入输出流获取成功");
    }
    catch (UnknownHostException e) {
    MyLog.i(TAG,
    "连接错误UnknownHostException 重新获取");
    e.printStackTrace();
    conn();
    }
    catch (IOException e) {
    MyLog.i(TAG,
    "连接服务器io错误");
    e.printStackTrace();
    }
    catch (Exception e) {
    MyLog.i(TAG,
    "连接服务器错误Exception" + e.getMessage());
    e.printStackTrace();
    }
    }

    public void initdate() {
    sp
    = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
    ip
    = sp.getString("ipstr", ip);
    port
    = Integer.parseInt(sp.getString("port", String.valueOf(port)));
    MyLog.i(TAG,
    "获取到ip端口:" + ip + ";" + port);
    }

    /**
    * 实时接受数据
    */
    @Override
    public void run() {
    MyLog.i(TAG,
    "线程socket开始运行");
    conn();
    MyLog.i(TAG,
    "1.run开始");
    String line
    = "";
    while (isRun) {
    try {
    if (client != null) {
    MyLog.i(TAG,
    "2.检测数据");
    while ((line = in.readLine()) != null) {
    MyLog.i(TAG,
    "3.getdata" + line + " len=" + line.length());
    MyLog.i(TAG,
    "4.start set Message");
    Message msg
    = inHandler.obtainMessage();
    msg.obj
    = line;
    inHandler.sendMessage(msg);
    // 结果返回给UI处理
    MyLog.i(TAG1, "5.send to handler");
    }

    }
    else {
    MyLog.i(TAG,
    "没有可用连接");
    conn();
    }
    }
    catch (Exception e) {
    MyLog.i(TAG,
    "数据接收错误" + e.getMessage());
    e.printStackTrace();
    }
    }
    }

    /**
    * 发送数据
    *
    *
    @param mess
    */
    public void Send(String mess) {
    try {
    if (client != null) {
    MyLog.i(TAG1,
    "发送" + mess + "至"
    + client.getInetAddress().getHostAddress() + ":"
    + String.valueOf(client.getPort()));
    out.println(mess);
    out.flush();
    MyLog.i(TAG1,
    "发送成功");
    Message msg
    = outHandler.obtainMessage();
    msg.obj
    = mess;
    msg.what
    = 1;
    outHandler.sendMessage(msg);
    // 结果返回给UI处理
    } else {
    MyLog.i(TAG,
    "client 不存在");
    Message msg
    = outHandler.obtainMessage();
    msg.obj
    = mess;
    msg.what
    = 0;
    outHandler.sendMessage(msg);
    // 结果返回给UI处理
    MyLog.i(TAG, "连接不存在重新连接");
    conn();
    }

    }
    catch (Exception e) {
    MyLog.i(TAG1,
    "send error");
    e.printStackTrace();
    }
    finally {
    MyLog.i(TAG1,
    "发送完毕");

    }
    }

    /**
    * 关闭连接
    */
    public void close() {
    try {
    if (client != null) {
    MyLog.i(TAG,
    "close in");
    in.close();
    MyLog.i(TAG,
    "close out");
    out.close();
    MyLog.i(TAG,
    "close client");
    client.close();
    }
    }
    catch (Exception e) {
    MyLog.i(TAG,
    "close err");
    e.printStackTrace();
    }

    }
    }

     说明:

    1.接收数据并读取时的推荐使用BufferedReader 会比直接读取要效率高些
    2.BufferedReader默认大小:8192个字节=84Mbit,utf-8下等于4596个字符 一般足够用了
    3.接收数据使用的是ReadLine,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'\n'换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据
    4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析
      in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));

     源码下载:下载地址

     


    转载请注明本文地址: Android笔记:Socket客户端收发数据
    展开全文
  • android 开发笔记

    2010-09-14 00:59:30
    由real6410公司提供的android开发笔记 针对real6410开发板,可迅速提高android开发 技能
  • Omni-Notes:开源笔记Android应用程序,有许多功能比如分享,搜索,附加图片,视频,音频,在笔记中涂鸦,添加提醒等。
  • 黑马程序员android笔记

    2013-04-07 19:53:40
    该文档是中关村黑马程序员内部笔记 内部包括全部的android基础视频 及项目视频的笔记
  • 新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.pdf 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记五--...
  • android笔记4

    2010-09-20 21:35:10
    android 开发笔记4 针对real6410开发板 可以迅速提高您开发android技术
  • 记录了作者学习安卓开发过程中见到的各种各样的问题 ,主要是用ANDROID STUDIO 3.2 开发,是学习ANDROID 开发不可多得的学习笔记,作者三个多月的心血,
  • 2019黑马28期android

    2019-05-16 19:33:12
    黑马28期android 全套高清完整无缺 视频+源码+笔记+软件
  • android基础笔记

    2018-10-02 19:09:54
    这个是android基础笔记,主要记录的是安卓的基础知识,可以看一下,深入的了解.
  • 不用描述啦,这是李兴华老师的Android开发实战经典随堂笔记,不看亏的是自己。这个是要配合李兴华老师的教学视频来看的,视频下载地址,在包里有。
  • 黑马Android培训笔记

    2018-12-07 18:08:36
    黑马Android培训笔记,内含java培训的详细文字描述,截图,代码
  • Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
  • android详细笔记

    2013-07-17 22:27:34
    android详细笔记资料
  • Android开发教程笔记完全版 谢谢大家
  • 收集的Android核心知识点笔记,JAVA知识点汇总、Android知识点汇总、Android拓展知识点、Android开源库源码分析、设计模式汇总、Gradle知识点汇总、常见面试算法题汇总。Android
  • 一、下载安装android studio软件 下载地址 http://www.android-studio.org/ 目前最新的版本是3.1.2版本,下载即可. 下载完成之后开始安装,安装过程不难如下 选择软件的安装路径 安装完成后启动...

    一、下载安装android studio软件

    下载地址
    http://www.android-studio.org/

    目前最新的版本是3.1.2版本,下载即可.
    这里写图片描述

    下载完成之后开始安装,安装过程不难如下
    这里写图片描述
    这里写图片描述

    选择软件的安装路径
    这里写图片描述

    这里写图片描述

    安装完成后启动android studio
    这里写图片描述

    这里默认选择”do not impor settings”,暂时不知道有啥作用
    这里写图片描述

    这里提示无法访问android SDK list,应该还需要安装配置android sdk.这里先选择cancel

    这里写图片描述

    进入welcome界面
    这里写图片描述

    这里写图片描述

    这里写图片描述

    点击上图的finish按钮后,就进入了android studio创建工程的界面.
    这里写图片描述

    如果此时点击新建工程会出现如下的提示,找不到android sdk
    这里写图片描述

    那么又如何安装配置android SDK呢?

    二、下载安装android SDK

    android SDK工具包下载地址
    http://www.androiddevtools.cn/
    选择下载如下的红色的工具包

    这里写图片描述

    下载完成后解压即可.

    再回到新建工程界面,点击下方的configure选择 SDK manager

    这里写图片描述

    进入如下界面后点击图中的edit

    这里写图片描述

    如下图,找到你的android sdk目录

    这里写图片描述

    这里写图片描述

    这里写图片描述

    配置完成后再来新建工程就可以了啊.
    这里写图片描述

    三、重新启动android studio的问题

    笔者第一次安装完毕android studio后关闭,再来打开时还是出现如下的提示

    这里写图片描述

    然后笔者选择cancel,依然提示找不到SDK如下:
    这里写图片描述

    点击next后,需要重新再选择SDK目录。

    这里写图片描述

    如果每次启动都这样的话,实现是太不方便了。
    我们不想每次启动都更新检查SDK,我们需要改一下Android Studio的配置文件,打开Android Studio安装路径下的bin文件夹找到 idea.properties文件,在最后添加代码disable.android.first.run=true即可
    C:\Program Files\Android\Android Studio\bin\idea.properties
    这里写图片描述

    然后再重新启动Android Studio就不会出现上面的提示了。

    四、小结

    安装android studio不难,但是需要配置sdk。
    如下两个文件是必须的。SDK容易下载错了笔者第一次就下的不对SDK配置老是不行。
    这里写图片描述

    附加:
    安装最新版本后新建工程出现各种异常报错,解决起来很麻烦,这里不再下载安装最新版本,可以参考如下地址下载如下的版本。
    http://www.android-studio.org/index.php/download/hisversion
    这里写图片描述
    安装此版本需要安装jdk环境,jdk安装比较简单可以自行安装即可这里不再赘述。

    软件版本:
    android-studio-bundle-143.2915827-windows.exe
    jdk-8u171-windows-x64.exe

    展开全文
  • Android笔记只Activity与Fragment之间通信

    万次阅读 多人点赞 2018-07-04 12:49:48
    正文之前先小唠几句,距离上次写博客已经快小半年了,之前的博客都是以记录为学习笔记为主,而这小半年没有产出,是需要反思的。反思的结果就是,这小半年我没多少进步,无论是在RN还是安卓原生开发的知识技术方面,...

    前言

    正文之前先小唠几句,距离上次写博客已经快小半年了,之前的博客都是以记录为学习笔记为主,而这小半年没有产出,是需要反思的。反思的结果就是,这小半年我没多少进步,无论是在RN还是安卓原生开发的知识技术方面,都没有实质上的突破,以至于没有新的值得我记录为博客的干货。
    俗话说,学海无涯,不进则退。因为这大半年基本上都从事着RN的相关开发,以至于把很多安卓原生的知识技能都落下了,之前关注的大佬博客公众号也很少看了。更悲哀的是,之前非常熟练的知识开发技能有些也生疏了。这几天之前的同事求教我一个问题,我了解过后,感觉这太小case了,之前开发过很多相似的功能,太熟练了。但是真正帮着写代码时却尴尬了,只隔了大半年而已,却硬是想不出这关键的几个步骤该怎么实现,这也是我写这篇博客的原因,同样作为笔记记录下来,以方便今后查阅。闲话扯完,下面开始正文。。。。

    常进行Android原生开发的同学都知道,Activity与Fragment之间、Fragment与Fragment之间的交互都是常规操作,是为进行开发的常规技能。首先看个简略图看几种情形:
    这里写图片描述
    我们先搭建基本页面:

    新建工程,创建Activity
    ...
    
    public class FragmentsTalkActivity extends AppCompatActivity implements View.OnClickListener {
    
        private SimpleFragment testFragment;
        private Button mBtn_AToF;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initView();
        }
        private void initView() {
            setContentView(R.layout.activity_fragments_talk);
            FragmentManager fm = getSupportFragmentManager();
            testFragment = (SimpleFragment) fm.findFragmentById(R.id.fragment2);
            mBtn_AToF = (Button)findViewById(R.id.btn_atof);
            mBtn_AToF.setOnClickListener(this);
        }
    }

    Activity对应布局:

    <?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:gravity="center_horizontal"
        android:orientation="vertical">
        <Button
            android:id="@+id/btn_atof"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:textAllCaps="false"
            android:text="从Activity到Fragment传值"/>
        <fragment
            android:id="@+id/fragment2"
            android:name="com.zhusp.androiddemo.fragment.SimpleFragment"
            android:layout_width="match_parent"
            android:layout_marginTop="20dp"
            android:layout_height="194dp"
            android:layout_margin="10dp"/>
    
    </LinearLayout>
    
    创建Fragment
    ...
    
    ...
    public class SimpleFragment extends Fragment{
    
        private static final String KEY_TITLE = "title";
        private String mTitle;
        private TextView mTv_msgFromActivity;
        private Button mBtn_sendToActivity;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return initView();
        }
    
        private View initView(){
            LinearLayout rootView = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.fragment_simple_layout,null);
            mTv_msgFromActivity = (TextView) rootView.findViewById(R.id.tv_fragment_msg);
            mBtn_sendToActivity = (Button) rootView.findViewById(R.id.btn_in_fragment);
            return rootView;
        }
    
        public static SimpleFragment newInstance(String title){
            Bundle bundle = new Bundle();
            bundle.putString(KEY_TITLE,title);
            SimpleFragment fragment = new SimpleFragment();
            fragment.setArguments(bundle);
            return fragment;
        }
    }

    对应fragment布局:

    <?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:gravity="center_horizontal"
        android:background="@color/colorAccent"
        android:padding="20dp"
        android:orientation="vertical">
        <Button
            android:id="@+id/btn_in_fragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="点击传值到Activity"/>
    
        <TextView
            android:id="@+id/tv_fragment_msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textColor="#000000"
            android:text="这是Fragment"/>
    </LinearLayout>

    接下来分别实现上图情景

    1.Activity传值到Fragment

    这里的传值应该包含两种情况:

    1) Fragment创建时传值

    这属于一次性传值,我们在Activity创建Fragment同时可以把一些数据通过setArgument()传递到Fragment。这是最基本的传值方式了,示例代码如下:

    testFragment = new SimpleFragment();
    Bundle sendBundle = new Bundle();
    sendBundle.putString("sendMessage","来自Activity首次创建Fragment传来的数据");
    testFragment.setArguments(sendBundle);

    然后在Fragment中通过getArgument()获取bundle数据

    Bundle b = getArgument();
    if(null != b){
        String message = b.getString("sendMessage");
    }

    特别注意:这中传值方式需要在Fragment没有被添加到FragmentManager之前使用,否则会报错误IllegalStateException: Fragment already active。因此这种传值方式不适合这里直接在xml文件里声明定义fragment的情况,因为这里在testFragment = (SimpleFragment) fm.findFragmentById(R.id.fragment2);这就代码执行后该Fragment已经被激活加入到FragmentManager上(即already active),因为这不是本文记录重点,就不再做细说

    2) Fragment已经被创建实时动态传值

    这类情景我们经常遇到,比如,我们在Activity点击一个按钮后更新Fragment上的某些数据,这里我们就以这种情况为例。我使用接口回调的方式,具体步骤如下:

    创建一个接口
    ...
    public interface ToFragmentListener {
        void onTypeClick(String message);
    }
    在Fragment中实现该接口
    ...
    public class SimpleFragment extends Fragment implements ToFragmentListener{
    
    ...
        //实现接口方法
        @Override
        public void onTypeClick(String message) {
            mTv_msgFromActivity.setText(message);//更新该组件上内容
        }
    }
    在Activity中获取接口实例调用方法
    ...
    
    public class FragmentsTalkActivity extends AppCompatActivity implements View.OnClickListener {
    
        private SimpleFragment testFragment;
        private ToFragmentListener mFragmentListener;
        private Button mBtn_AToF;
        private int tapCounts = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initView();
            initData();
        }
    
        private void initView() {
            setContentView(R.layout.activity_fragments_talk);
            FragmentManager fm = getSupportFragmentManager();
            testFragment = (SimpleFragment) fm.findFragmentById(R.id.fragment2);
            mBtn_AToF = (Button)findViewById(R.id.btn_atof);
            mBtn_AToF.setOnClickListener(this);
        }
    
        private void initData() {
            //这步是关键,因为Fragment实现了该接口,所以可以直接把Fragment实例赋值给接口引用
            mFragmentListener = testFragment;
        }
    
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_atof:
                    if(null != mFragmentListener){
                        tapCounts ++;
                        mFragmentListener.onTypeClick("来自Activity的实时数据"+tapCounts);
                    }
                    break;
            }
        }
    
    }
    

    搞定,下面看下效果:
    这里写图片描述
    录制的时候不知道是丢帧还是咋滴了,“实时数据2”没有展示出来╮(╯▽╰)╭,不管了,效果就这样。
    接下来是通过控制Fragment更新Activity上的数据

    2.Fragment传值到Activity

    这个功能相信大多小伙伴也都能自己实现,同样的使用接口的方式,只不过跟前面反着来就是了

    同样的先写一个接口(当然也可以复用上面的接口),为了区分,我重写一个
    ...
    public interface ToFragmentListener {
        void onTypeClick(String message);
    }
    在Fragment中设置获取接口实例调用方法
    ...
    public class SimpleFragment extends Fragment implements ToFragmentListener,View.OnClickListener{
    
        private static final String KEY_TITLE = "title";
        private String mTitle;
        private TextView mTv_msgFromActivity;
        private Button mBtn_sendToActivity;
        private ToActivityListener toActivityListener;
        private int tapCounts = 0;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            ...
            return initView();
        }
    
        private View initView(){
            LinearLayout rootView = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.fragment_simple_layout,null);
            mTv_msgFromActivity = (TextView) rootView.findViewById(R.id.tv_fragment_msg);
            mTv_msgFromActivity.setText(mTitle);
            mBtn_sendToActivity = (Button) rootView.findViewById(R.id.btn_in_fragment);
            mBtn_sendToActivity.setOnClickListener(this);
            return rootView;
        }
    
        public void setToActivityListener(ToActivityListener listener){
            this.toActivityListener = listener;
        }
    
        @Override
        public void onTypeClick(String message) {
            mTv_msgFromActivity.setText(message);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_in_fragment:
                    if(null != toActivityListener){
                        tapCounts++;
                        toActivityListener.toActivityClick("来自Fragment的数据"+tapCounts);
                    }
                    break;
            }
        }
    }
    在Activity中设置实例化该接口
    ...
    
    public class FragmentsTalkActivity extends AppCompatActivity implements View.OnClickListener {
    
        private SimpleFragment testFragment;
        private ToFragmentListener mFragmentListener;
        private Button mBtn_AToF;
        private int tapCounts = 0;
        private TextView mTv_fragmentMsg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initView();
            initData();
        }
    
        private void initView() {
            setContentView(R.layout.activity_fragments_talk);
            FragmentManager fm = getSupportFragmentManager();
            testFragment = (SimpleFragment) fm.findFragmentById(R.id.fragment2);
            mBtn_AToF = (Button)findViewById(R.id.btn_atof);
            mBtn_AToF.setOnClickListener(this);
            mTv_fragmentMsg = (TextView)findViewById(R.id.tv_from_fragment);
        }
    
        private void initData() {
            mFragmentListener = testFragment;
            //Fragment设置接口回调
            testFragment.setToActivityListener(new ToActivityListener() {
                @Override
                public void toActivityClick(String message) {
                    mTv_fragmentMsg.setText(message);
                }
            });
        }
    
        ...
    
    }
    

    搞定,下面看效果
    这里写图片描述

    好了,今天的博客笔记就先写到这,细心的朋友可以发现,关于Activity与Fragment之间的交互,我并没有用到安卓sdk提供的API,完全是纯Java基本手段实现的。
    当然还有Fragment与Fragment之间的交互,其实差不多,可以用上面两种情况的结合使用(Fragment-Activity-Fragment),当然安卓也给我提供了更方便的API,后边有时间再记录下

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 155,717
精华内容 62,286
关键字:

android笔记