安卓项目经验总结
我觉得安卓把第一行代码看了之后,做项目是提升技术最快的方法了。可能最开始不会写,那就在网上找模板,先把别人的读懂了,再添加到自己的代码中。用别人的代码会出现各种各样的bug,我最开写代码时就是把别人某一部分代码复制过来,然后发现可以运行但总是在打开的时候报错,出现NullPointerException异常。
我总结一下我遇到的空指针异常的情况
- 当程序运行时,对象未初始化或为空。检测一下报错位置的变量是否初始化了。
- 往往遇见情况的反而是你已经初始化了还是报空指针异常。比如xml布局文件中对应的控件名不正确,比如我应该用androidx.开头的控件,然后我从别人那复制过来的时候是android开头的,我们就要主要检查变量绑定的控件名是否正确。
- 由于生命周期的顺序先后问题,尤其是在Fragment当中,比如onCreate在onCreateView之前执行,而我们却在onCreate方法中操作了onCreateView中才初始化的对象。
onCreateView是创建的时候调用,onViewCreated是在onCreateView后被触发的事件,且onStart运行时间位于onViewCreated之后
二.在自定义Toolbar中添加Menu选项
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);//首先在onCreate中设置可以有这个menu选项
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
//把Java文件对应的xml转化成view对象
//inflater()的作用就是将一个用xml定义的布局文件查找出来,与findViewById()的区别,inflater是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。
myView = inflater.inflate(R.layout.wardrobe, container, false);
//后面就是动态添加控件到view对象中
toolbar = myview.findViewById(R.id.toolbar1); //必须加载完布局文件之后才能绑定控件,否则绑定的布局是一个空对象,因为其没有具体的布局文件对象
return myView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//在进行操作之前,确保toolbar初始化完成
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.inflateMenu(R.menu.toolbar);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.toolbar, menu);
super.onCreateOptionsMenu(menu, inflater);
}
三.写一个xml布局文件的时候先想好大致框架再往里面添加控件
<DrawerLayout>
<CoordinatorLayout>
<AppBarLayout>
<Toolbar/>
<TabLayout/>
</AppBarLayout>
<ViewPager/>
</CoordinatorLayout>
<NavigationView/>
</DrawerLayout>
四.Activity和Fragment之间的联系和区别
1.生命周期的不同
- Activity有7个生命周期,而Fragment有11个生命周期。
- 所以Fragment比较与Activity来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。
2.fragment可以直接在XML文件中添加
<fragment
Android:id="@+id/test_fragment1"
Android:name="com.example.fragmenttest.TestFragment1"/>
3.fragment可以在一个界面上灵活的替换一部分页面,activity 只能进行跳转切换。
4.fragment和Activity之间的通信
- fragment控制fragment:得到一个Activity,然后通过这个Activity的
getFragmentManager()获得该Fragment的实例。
getFragmentManager到的是activity对所包含fragment的Manager,而如果是fragment嵌套fragment,那么就需要利用getChildFragmentManager()了
getSupportFragmentManager()主要用于支持 3.0以下android系统API版本,3.0以上系统可以直接调用getFragmentManager() ,因为fragment是3.0以后才出现的组件。
- fragment控制Activity:每个Fragment都可以通过getActivity()得到一个活动。MainActivity activity=getActivity();
要在fragment中更新UI时,我们必须在runOnUiThread()的前面添加getActivity() - Activity控制fragment:xxxFragment xxx=getFragmentManager().findFragmentById();
- Activity控制Activity:这个显然是通过Intent活动之间的通信完成。
5.fragment和Activity中控件的加载
- Fragment的载入是通过OnCreateView的时候通过inflater.inflate()加载布局
- Activity的载入是通过OnCreate的时候通过setContentView()加载布局
五.JSON数据获取与解析、使用开放接口
1.遇到这样的URL需要在解析JSON数据时手动加上 http: 或者 https:
2.遇到网络问题或者没有报错显示异常的问题,先把原来的app删了再重装试试