小游网app开发过程记录


[success]前面说自己想开发一个云端密码管理的app,这个是比较复杂的,所以我就先拿一个简单的来练练手,所以打算给自己的网站做一个app,然后因为自己除了基础,其他的什么都不会,所以就打算把自己整个开发过程记下了,这个就相当于草稿一样,所以肯定是很乱的,整个文章将以时间线的形式记录下来。[/success]

----6月6号

开发需求大概就是这些,那么先实现这些功能吧。

1.先把三个部分搞好

这个是可以新建一个安卓的图标的。

然后我们到布局文件那里

这里可以修改我们的图标和名字

现在来实现一下点击不同图标进入不同界面。

安卓新建一个界面就是在layout那里新建一个activity。

然后我们现在要是实现点击切换不同界面

核心思路就是自己先写一个界面然后在在点击切换是把自己写的这个界面在我们当前界面上显示。(这个就是目前的一个难题,主要是我从来没有这个做过)

百度了好久找到一个叫fragment的东西,先来试一下。(捣鼓了一下发现可以实现这些功能了)

这里说一下怎么用,首先我们可以新建一个package包(主要为了方便后面管理)

然后我们需要创建3个Fragment,因为我们有3个板块

然后还需要新建3个对应的布局文件(这里不再演示)

然后我们在自己新建的fragment的java文件里面的代码这样写:

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_index(这个是我们的布局文件),container,false);
        return view;
    }

主页切换的逻辑代码

//我们要切换的话,需要自己把java文件引进来
private IndexFragment indexfragment;//这个就是主页的fragment               
//下面这个是切换fragment的
indexfragment=new IndexFragment();               getSupportFragmentManager().beginTransaction().replace(R.id.fr_container,indexfragment).commitAllowingStateLoss();

--------------下一个功能:网页浏览

要实现网页浏览,我们需要有访问网络的权限(直接在mainnifest文件里面添加下面的代码)<uses-permission android:name="android.permission.INTERNET" />直接在在到manifest里面就可以了。

然后网页设置就可以直接写了:

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);//这个要放在前面
        mwebview=view.findViewById(R.id.index_id);//这里要加一个view,就是在单前
        mwebview.getSettings().setJavaScriptEnabled(true);//支持js
        mwebview.loadUrl("https://xiaoyou66.com/");
        
    }

然后我们想让标题实时改变,因为是fragment,所以不能直接修改,我们需要让他们可以通信。

我们可以通过接口来实现:

先到我们的Fragment里面先定义一个接口变量

private showdata mcallback;

然后我们自己写一个接口

// 自己写一个接口用来和activity进行通信
public interface showdata{
void showwebdata(String s);//这里我们设置一个方法
}


这里我们写了一个函数,让activity去实现这个函数。然后我们就需要在fragment实现这个接口:

@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mcallback=(showdata)context;
}catch (ClassCastException e){
throw new ClassCastException("主activity需要实现该方法");
}
}

然后我们就可以在fragment里面实现这个函数了

实现方法:

mcallback.showwebdata(s);//这里我们就实现了调用接口函数

最后我们需要在主activity里面去继承这个接口:

public class MainActivity extends AppCompatActivity implements IndexFragment.showdata{//这里我们继承那个接口

然后我们重写这个函数:

//这里我们重写fragment里面的方法
@Override
public void showwebdata(String s) {
setTitle(s);//我们要修改自己的标题
}
}

这里我们还有一个问题:就是网页无法跳转,以及按返回键无法返回原来的网页,慢慢来吧。。。

先实现在本页进行网页跳转:

其实就是需要自己重写webviewclient方法(这里我就不说了,后面会把源代码贴出来)

然后至于返回键事件,我们的Fragment和activity不一样,没有专门的重写返回键的方法,所以我只好去谷歌

具体参考这个文章(传送门

这个文章好像有点问题,我找了另外一个(传送门)这个好像有用,不过我现在还是有一个问题,就是返回时标题不会正常显示,所以只能想个办法了,这个让我想到了用栈来实现这个效果(这里大家可以看后面的代码)

--------6月7号

昨天敲了一天的代码,好累啊!今天是端午,今天要继续肝一天,争取把这个ap开发出来。

继续昨天的问题:我们用栈的方式成功实现了网页标题的正确显示,那么我们现在要重写返回事件,如果你浏览了网页,那么点击返回时只是回退上一个网页,如果是返回到了原始的网页,那么就直接退出应用,这个可以通过栈的大小来进行判断,具体实现代码可以自己看我的github

现在是实现板块的功能:

板块我还是打算用网页来实现,主要是因为我懒。。。不过把板块这个网页做出来也要很久,那么先开始做吧。。。

4个小时后。。。这个网页终于写出来了,真的写一个网站页的不容易。。

然后其他的都不需要改,直接修改一下webview的url就行了,我们这个需要进行activity和fragment的通信。。。

这里我们可以在fragment里面写一个静态方法

 //这里写一个activity和fragment通信的方法
public static IndexFragment newInstance(String title){//这样就可以重写方法了
    IndexFragment fragment=new IndexFragment();
    Bundle bundle =new Bundle();
    bundle.putString("url",title);
    fragment.setArguments(bundle);//通过这样一种方法,就可以绑定参数,这样即使被回收也会重新赋值
    return fragment;
}

然后我们在实例化fragment的时候就可以传递参数了

indexfragment=IndexFragment.newInstance("https://xiaoyou66.com/");
getSupportFragmentManager().beginTransaction().replace(R.id.fr_container,indexfragment).commitAllowingStateLoss();

我们在把原来的代码改一下(这个是在oncreated方法里面):

if(getArguments()!=null) mwebview.loadUrl(getArguments().getString("url"));

这样就可以点击不同的导航条传递不同的网址了。当初我们写的那3个fragment现在只需要两个了。。

好了现在来实现最难的登录功能吧。。。。(*^▽^*)

先把界面设计好。。

我们先设计登录成功的界面,其实就是显示一个头像还有其他信息,我们加一个虚线分割线把:

这里我们使用的是view,自己画一个虚线然后显示出来(参考文章)。

好,那么现在画那个登陆界面吧。。

史上最丑UI界面。。。。:

算了,先就这样把,先把最基本的功能做出来,UI界面后面在改。。

不知不觉到中午了,好累啊。。先去吃饭了。。

今天睡了一下午,感觉自己好懒啊,中午直接睡了4个小时。。

算了继续工作。。

现在我们要寻找登录的接口了,直接用抓包工具来抓下包来试一下。

好了我用fiddler抓了一下包成功了,其实就是向https://xiaoyou66.com/wp-login.php这个页面发送post请求,刚才用Python模拟登录成功了,现在就用安卓来试一下吧。。

1.我们可以把安卓的发送post请求的方法封装成一个类,然后在activity里面调用就行了。 这个好像没用。。

然后这里我看到了一种实现方法,使用jsoup库,那么来试一下吧,这里我说一下安卓怎么导入第3方库,我们直接在bulid.gradle里面,在dependencies里面添加上implementation 'org.jsoup:jsoup:1.12.1'

然后它就会要我们同步,同步一下这个jar包就安装好了。。

然后还是自己新建一个静态的类,然后到fragment里面调用一下

然后一直报错。。。

最后我用错误和异常处理看了一下错误信息:NetworkOnMainThreadException

然后百度了一下发现是从SDK3.0开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在主线程中。。。

所以还要学线程操作(发一个http请求太难了啊!)

我们暂时不需要进行异步通信,所以就暂时不用Hander。

好像报错了,似乎必须要用handel。。算了,先搞一下试一下。。

用了Handel后终于成功获取到了测试数据。

现在来实验一下,测试成功!

接下来就是想办法获取自己的用户名和头像。

这里我们使用bundle来存储数据。

这里我们要获取数据的话,首先要获取cookie数据,然后通过cookie访问个人信息页

测试了一番,可以获取数据了,下面就是判断登录是否成功

然后就是自己通过输入框输入数据进行登录

后面就是修改内容,把内容显示在app上。。

我们想让图片控件显示网络图片的话,可以使用相应的库;

这里我们使用glide库(官网传送门

这库怎么用我这里就不说了,然后就是实验了。。

实验成功!

下面就是把其他的按钮的功能做一下:

今天先暂时到这里。。。

好累啊。。。

 

-----6月8号

继续肝了!放个假过的比平时还累,不容易啊。。

继续。

不过还是先把这个巨丑无比的界面做好吧!

关于那个显示圆形头像的,我找到了一个开源的项目(项目地址

搞了一上午,做出了一个还是挺丑的UI不过还是有很多bug,算了,先吃饭去。。

 

下午。。。。

感觉这几天每天除了寝室,食堂,实验室就没去过其他地方。。

现在这个UI是做出来了,登录板块也可以了,下面就是想办法获取cookie数据,可以用账号来发表评论。

cookie数据好像是map,所以不能直接存储在shardpreference里面。。。

然后百度了一下,好像要安装一个叫gson的东西。。。看来一个小功能实现也不容易啊

后面发现webview设置cookie时不需要map,可以直接传递string,所以我们直接把string数据存起来就行了。。

但是我们还需要把map数据转换成string。。。百度搜一下把。。

然后就是设置cookie了,搞了半天才发现cookie每次只能设置一个,所以我们要多次设置cookie。。。(在这里起码搞了2个小时)

修改后终于可以正常显示了,这个功能终于做好了。。

到真机上测试一下。。(可以了。。。)

那么把其他的功能完善一下。。。

又有bug了。。好像是登录后有概率不保存数据。。。(这个。。)

这个好像是只要你退在进去数据就会丢失。。

搞了半天发现数据根本没有丢。。。。是函数写错了。。。

 

现在来实现最后一个功能:修改个人资料。。

(本来都写的差不多了,然后电脑奔溃了,我也要奔溃了。。)

这里我打算用alert里面加一个webview来实现。

不过有一个问题。。图片无法上传。。

于是百度了一大堆解决办法,找了一个大佬的代码(直接粘贴上去了,代码看不懂。。。)然后测试了一下,好像有用。。。

到真机上试一下。。打不开? 原来是cookie的问题,需要判断cookie是否有效。。

问题又来了。。打开的网页无法弹出键盘。。这个问题就真的。。。

找解决办法把。。

百度找了一大堆方法都没用(有捣鼓了1个多小时。。。)

最后发现问题不在webview上,而是在alert上面,这个就真的无语了。。

修改后总于有用了。。。

应该都完成了吧。先暂时就到这里,我实在不想在捣鼓了。。。

 

最后总结就是有问题,不要急,慢慢来,总会有解决办法的。


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录