R.drawable.tab_recommend,
R.drawable.tab_user
};
private String[] tab_array;
private DemandAdapter mDemandAdapter;
private ArrayList fragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
// 给viewpager设置适配器
setViewPagerAdapter();
setTabBindViewPager();
setItem();
}
private void initData() {
tab_array = getResources().getStringArray(R.array.tab_main);
fragments.clear();
fragments.add(FragmentUtils.getHomeFragment());
fragments.add(FragmentUtils.getChatFragment());
fragments.add(FragmentUtils.getRecomFragment());
fragments.add(FragmentUtils.getMeFragment());
}
private void initView() {
mMViewPager = (ViewPager) findViewById(R.id.mViewPager);
mToolbarTab = (TabLayout) findViewById(R.id.toolbar_tab);
}
private void setViewPagerAdapter() {
mDemandAdapter = new DemandAdapter(getSupportFragmentManager());
mMViewPager.setAdapter(mDemandAdapter);
}
private void setTabBindViewPager() {
mToolbarTab.setupWithViewPager(mMViewPager);
}
private void setItem() {
/**
- 一定要在设置适配器之后设置Icon
*/
for (int i = 0; i < mToolbarTab.getTabCount(); i++) {
mToolbarTab.getTabAt(i).setCustomView(getTabView(i));
}
}
public View getTabView(int position) {
View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);
ImageView tab_image = view.findViewById(R.id.tab_image);
TextView tab_text = view.findViewById(R.id.tab_text);
tab_image.setImageResource(tabIcons[position]);
tab_text.setText(tab_array[position]);
return view;
}
/**
- 适配器
*/
public class DemandAdapter extends FragmentStatePagerAdapter {
public DemandAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
}
代码中有注释,切很简单,不会出现什么毛病!如果有小毛病,就clean一下解决
- 跨模块跳转Activity
实现这个Activity跳转的路径。
//跳转到我的模块登录页面
public static final String Me_Login = “/me/main/login”;
ARouter跳转Activity,在这个Activity上加入注解。
@Route(path = RouteUtils.Me_Login)
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
跳转逻辑是
//登录(跨模块跳转Activity)
ARouter.getInstance().build(RouteUtils.Me_Login).navigation();
- 跨模块实现ForResult返回数据(activity中使用)
实现这个Activity跳转的路径。
//跳转ForResult
public static final String Chat_ForResult = “/chat/main/ForResult”;
ARouter跳转Activity,在这个Activity上加入注解。
@Route(path = RouteUtils.Chat_ForResult)
public class ForResultActivity extends AppCompatActivity implements View.OnClickListener {
跳转逻辑是
//跳转ForResult,在fragment中使用不起作用
ARouter.getInstance().build(RouteUtils.Chat_ForResult).navigation(this, 666);
接收数据数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 666:
String name = data.getStringExtra(“name”);
UIUtils.showToast(name + “,resultCode===>” + resultCode);
break;
default:
break;
}
}
返回数据
Intent intent = new Intent();
intent.putExtra(“name”, “ForResult返回的数据”);
setResult(999, intent);
finish();
- 跳转并携带参数和Eventbus夸模块通信
EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
@Subscriber(tag = EvenBusTag.GOTO_EVENTBUS)
public void onEvent(String s) {
UIUtils.showToast(s);
}
//跳转到eventBus数据接收页面
public static final String Me_EventBus = “/me/main/EventBus”;
@Route(path = RouteUtils.Me_EventBus)
public class EventBusActivity extends AppCompatActivity implements View.OnClickListener {
// 跳转并携带参数,基本涵盖所以类型传递,具体可以查看Postcard类
//传递过去的值使用getIntent()接收
//在fragment中无法使用ForResult进行夸模块传递数据
//在activity中可以(详细请看LoginActivity)这里的EventBusBean 已经实现了Parcelable接口
EventBusBean eventBusBean = new EventBusBean();
eventBusBean.setProject(“android”);
eventBusBean.setNum(3);
ARouter.getInstance().build(RouteUtils.Me_EventBus)
.withString(“name”, “haungxiaoguo”)
.withLong(“age”, 25)
.withParcelable(“eventbus”, eventBusBean)
.navigation();
@Route(path = RouteUtils.Me_EventBus)
public class EventBusActivity extends AppCompatActivity implements View.OnClickListener {
/**
- eventBus数据接收页面
*/
private TextView mTextView;
/**
- eventBus返回数据
*/
private Button mBtnBackData;
private String name;
private long age;
private EventBusBean eventbus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
ARouter.getInstance().inject(this);
initData();
initView();
}
private void initData() {
name = getIntent().getStringExtra(“name”);
age = getIntent().getLongExtra(“age”, 0);
eventbus = getIntent().getParcelableExtra(“eventbus”);
}
private void initView() {
mTextView = (TextView) findViewById(R.id.textView);
mBtnBackData = (Button) findViewById(R.id.btn_back_data);
mBtnBackData.setOnClickListener(this);
mTextView.setText(“name=” + name + “,\tage=” + age + “,\tproject=” + eventbus.getProject() +
“,\tnum=” + eventbus.getNum());
}
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.btn_back_data) {
EventBus.getDefault().post(name, EvenBusTag.GOTO_EVENTBUS);
finish();
} else {
}
}
}
- 使用Uri应用内跳转
EventBusBean eventBusBean = new EventBusBean();
eventBusBean.setProject(“android”);
eventBusBean.setNum(3);
Uri testUriMix = Uri.parse(“arouter://tsou.cn.huangxiaoguo/me/main/EventBus”);
ARouter.getInstance().build(testUriMix)
.withString(“name”, “haungxiaoguo”)
.withLong(“age”, 25)
.withParcelable(“eventbus”, eventBusBean)
.navigation();
- 旧版本转场动画
//旧版本转场动画
ARouter.getInstance()
.build(RouteUtils.Me_Test)
.withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
.navigation(getContext());//context上下文不传无效果
- 新版本转场动画
//新版本转场动画
if (Build.VERSION.SDK_INT >= 16) {
ActivityOptionsCompat compat = ActivityOptionsCompat.
makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);
ARouter.getInstance()
.build(RouteUtils.Me_Test)
.withOptionsCompat(compat)
.navigation();
} else {
UIUtils.showToast(“API < 16,不支持新版本动画”);
}
- 通过URL跳转(webview)
//通过URL跳转(webview)
ARouter.getInstance()
.build(RouteUtils.Me_WebView)
.withString(“url”, “file:///android_asset/schame-test.html”)
.navigation();
首先实现IInterceptor:
package tsou.cn.lib_base.interceptor;
import android.content.Context;
import android.util.Log;
import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.annotation.Interceptor;
import com.alibaba.android.arouter.facade.callback.InterceptorCallback;
import com.alibaba.android.arouter.facade.template.IInterceptor;
import com.alibaba.android.arouter.launcher.ARouter;
import tsou.cn.lib_base.utils.RouteUtils;
/**
-
Created by Administrator on 2017/12/6 0006.
-
添加拦截器的时候,建议clean再打包运行,不然会出现,无效的情况
-
-
切记一个项目里面priority的值保证唯一,不然会出毛病
*/
@Interceptor(priority = 1, name = “重新分组进行拦截”)
public class MyDataInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
if (postcard.getGroup().equals(“needLogin”)) {
Log.e(“huangxiaoguo”, “需要去登陆”);
//直接执行
// callback.onContinue(postcard);
//直接拦截,走onLost方法
// callback.onInterrupt(null);
//添加数据
// postcard.withString(“extra”, “我是在拦截器中附加的参数”);
// callback.onContinue(postcard);
callback.onInterrupt(null);
ARouter.getInstance().build(RouteUtils.Me_Login)
.withString(“path”, postcard.getPath()).navigation();
} else {
postcard.withString(“extra”, “我是在拦截器中附加的参数”);
callback.onContinue(postcard);
}
}
@Override
public void init(Context context) {
}
}
接收未拦截时拦截器添加的数据(postcard.withString(“extra”, “我是在拦截器中附加的参数”);)
private void initData() {
extra = getIntent().getStringExtra(“extra”);
}
对目标Activity指定新的分组(组名为“needLogin”,注意同时也是“me”组下的成员)
@Route(path = RouteUtils.Me_Test2, group = “needLogin”)
public class Test2Activity extends AppCompatActivity {
- 拦截器操作(利用重新分组拦截)
/**
- 如果利用重新分组,就需要在build中进行指定的分组不然没有效果
*/
ARouter.getInstance()
.build(RouteUtils.Me_Test2, “needLogin”)
.navigation(getContext(), new NavCallback() {
@Override
public void onFound(Postcard postcard) {
super.onFound(postcard);
//路由目标被发现时调用
Log.e(“huangxiaoguo”, “发现了”);
}
@Override
public void onLost(Postcard postcard) {
super.onLost(postcard);
//路由被丢失时调用
Log.e(“huangxiaoguo”, “丢失了”);
}
@Override
public void onArrival(Postcard postcard) {
//路由到达之后调用
Log.e(“huangxiaoguo”, “到达了”);
}
@Override
public void onInterrupt(Postcard postcard) {
super.onInterrupt(postcard);
//路由被拦截时调用
Log.e(“huangxiaoguo”, “拦截了”);
}
});
- 拦截器操作(利用原有分组)
/**
- 专门的分组,这里就叫做needLogin组,凡是在这个组下的,都会进行登录操作
*/
public static final String NeedLogin_Test3 = “/needLogin/main/Test3”;
@Route(path = RouteUtils.NeedLogin_Test3)
public class Test3Activity extends AppCompatActivity {
//拦截器操作(利用原有分组)
ARouter.getInstance().build(RouteUtils.NeedLogin_Test3).navigation();
- 拦截器操作(绿色通道,跳过拦截器)
//拦截器操作(绿色通道,跳过拦截器)
ARouter.getInstance().build(RouteUtils.NeedLogin_Test3)
.withString(“extra”, “我是绿色通道直接过来的,不经过拦截器”)
.greenChannel()
.navigation();
- 依赖注入
必须先初始化JsonServiceImpl实现SerializationService
package tsou.cn.lib_base.JsonService;
import android.content.Context;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.facade.service.SerializationService;
import com.alibaba.fastjson.JSON;
import java.lang.reflect.Type;
import tsou.cn.lib_base.utils.RouteUtils;
/**
- 依赖注入使用,注意:必须实现SerializationService进行注册,
*/
@Route(path = RouteUtils.Home_Json_Service,name = “序列化JavaBean使用”)
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {
}
@Override
public T json2Object(String text, Class clazz) {
return JSON.parseObject(text, clazz);
}
@Override
public String object2Json(Object instance) {
return JSON.toJSONString(instance);
}
@Override
public T parseObject(String input, Type clazz) {
return JSON.parseObject(input, clazz);
}
}
实现跳转
/**
-
序列化过得
-
必须先初始化JsonServiceImpl实现SerializationService
*/
EventBusBean eventBusBean = new EventBusBean();
eventBusBean.setProject(“android”);
eventBusBean.setNum(3);
/**
- 普通的javaBean
*/
JavaBean javaBean = new JavaBean();
javaBean.setName(“huangxiaoguo”);
javaBean.setAge(25);
List objList = new ArrayList<>();
objList.add(javaBean);
Map<String, List> map = new HashMap<>();
map.put(“testMap”, objList);
ARouter.getInstance().build(RouteUtils.Me_Inject)
.withString(“name”, “老王”)
.withInt(“age”, 18)
.withBoolean(“boy”, true)
.withLong(“high”, 180)
.withString(“url”, “https://www.baidu.com”)
.withParcelable(“pac”, eventBusBean)
.withObject(“obj”, javaBean)
.withObject(“objList”, objList)
.withObject(“map”, map)
.navigation();
接收数据
package tsou.cn.module_me.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Autowired;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import java.util.List;
import java.util.Map;
import tsou.cn.lib_base.bean.EventBusBean;
import tsou.cn.lib_base.bean.JavaBean;
import tsou.cn.lib_base.utils.RouteUtils;
import tsou.cn.module_me.R;
/**
- 依赖注入使用,注意:必须实现SerializationService进行注册,
*/
@Route(path = RouteUtils.Me_Inject)
public class InjectActivity extends AppCompatActivity {
@Autowired
String name = “hahahha”;
@Autowired
int age = 13;
@Autowired(name = “boy”)//映射参数名
boolean sex;
@Autowired
long high = 160;
@Autowired
String url;
@Autowired
EventBusBean pac;
@Autowired
JavaBean obj;
@Autowired
List objList;
@Autowired
Map<String, List> map;
@Autowired
int height = 21;//上页面没有传递
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inject);
ARouter.getInstance().inject(this);
initView();
}
private void initView() {
mTextView = (TextView) findViewById(R.id.textView);
String params = String.format(
“name=%s,\n age=%s, \n height=%s,\n girl=%s,\n high=%s,\n url=%s,\n pac=%s,\n obj=%s \n” +
" objList=%s, \n map=%s",
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
id.textView);
String params = String.format(
“name=%s,\n age=%s, \n height=%s,\n girl=%s,\n high=%s,\n url=%s,\n pac=%s,\n obj=%s \n” +
" objList=%s, \n map=%s",
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-rHL1zU25-1710896534383)]
[外链图片转存中…(img-16cUlTZD-1710896534384)]
[外链图片转存中…(img-HmJsGqOn-1710896534384)]
[外链图片转存中…(img-CP0Crjoq-1710896534384)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-dv7CLWi9-1710896534385)]
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
[外链图片转存中…(img-qwRhgFIF-1710896534385)]