Lua布局fusionapp 收藏功能与历史记录实现

第一部分 程序启动时会执行的事件

--程序启动时会执行的事件

--清除缓存
function clr()
  --导入File类
  import "java.io.File"
  --显示多选框
  items={"浏览记录","缓存文件"}
  多选对话框=AlertDialog.Builder(this)
  .setTitle("清除记录")
  --勾选后执行
  .setPositiveButton("确定",function()
    if clearhistory==1 and clearall==1 then
      File(lstads).delete()
      File(lstwebads).delete()
      lst={}
      lstweb={}
      os.execute("pm clear "..activity.getPackageName())
    elseif clearhistory==0 and clearall==1 then
      os.execute("pm clear "..activity.getPackageName())
    elseif clearhistory==1 and clearall==0 then
      File(lstads).delete()
      File(lstwebads).delete()
      lst={}
      lstweb={}
    else return nil
    end
  end)
  --选择事件
  .setMultiChoiceItems(items, nil,{ onClick=function(v,p)
      --清除历史
      if p==0 then clearhistory=1
      end
      --清除缓存
      if p==1 then clearall=1
      end
    end})
  多选对话框.show();
  clearhistory=0
  clearall=0
end


--1.地址
favads="/data/data/"..activity.getPackageName().."/fav.lua"
favwebads="/data/data/"..activity.getPackageName().."/favweb.lua"

--2.序列化
function slz(obj) 
  local lua = "" 
  local t = type(obj) 
  if t == "number" then 
    lua = lua .. obj 
  elseif t == "boolean" then 
    lua = lua .. tostring(obj) 
  elseif t == "string" then 
    lua = lua .. string.format("%q", obj) 
  elseif t == "table" then 
    lua = lua .. "{\n" 
    for k, v in pairs(obj) do 
      lua = lua .. "[" .. slz(k) .. "]=" .. slz(v) .. ",\n" 
    end 
    local metatable = getmetatable(obj) 
    if metatable ~= nil and type(metatable.__index) == "table" then 
      for k, v in pairs(metatable.__index) do 
        lua = lua .. "[" .. slz(k) .. "]=" .. slz(v) .. ",\n" 
      end 
    end 
    lua = lua .. "}" 
  elseif t == "nil" then 
    return nil 
  else 
    error("can not serialize a " .. t .. " type.") 
  end 
  return lua 
end 
function rslz(lua) 
  local t = type(lua) 
  if t == "nil" or lua == "" then 
    return {}
  elseif t == "number" or t == "string" or t == "boolean" then 
    lua = tostring(lua) 
  else 
    error("can not unserialize a " .. t .. " type.") 
  end 
  lua = "return " .. lua 
  local func = loadstring(lua) 
  if func == nil then 
    return nil 
  end 
  return func() 
end

--3.读取收藏文件
function read_fav()
  import "java.io.File"
  File(favads).createNewFile()
  sfav=io.open(favads):read("*a")
  File(favwebads).createNewFile()
  sfavweb=io.open(favwebads):read("*a")
  --转换成table
  fav=rslz(sfav)
  favweb=rslz(sfavweb)
end

--4.存储收藏文件
function save_fav()
  --转换成string
  sfav=slz(fav)
  sfavweb=slz(favweb)
  --保存
  file=io.open(favads,"w+")
  io.output(file)
  io.write(sfav)
  io.flush()
  io.close(file)
  file=io.open(favwebads,"w+")
  io.output(file)
  io.write(sfavweb)
  io.flush()
  io.close(file)
end

--5.收藏夹布局
function favshow()
  favlayout={
    LinearLayout,
    orientation="1",
    gravity="center",
    layout_width="wrap_content",
    layout_height="wrap_content",
    {
      TextView,
      text="",
      gravity="center",
      layout_width="wrap_content",
      textSize="0sp",
      background="#000000",
      layout_height="15dp",},
    {
      TextView,
      text="收藏夹",
      gravity="center",
      layout_width="wrap_content",
      textSize="30sp",
      textStyle="bold",
      layout_height="50dp",},
    {
      ListView,
      id="favlv",
      items=fav,
      layout_width="fill",
      layout_height="wrap_content",
    },
  }
end

--6.收藏夹显示
function show_fav() 
  read_fav()
  favshow()
  fl=AlertDialog.Builder(activity)
  .setView(loadlayout(favlayout))
  .setNegativeButton("取消",DialogInterface.OnClickListener{
    onClick=function()
    end
  })
  .create()
  fl.show()
  favlv.onItemClick=function(l,v,c,b)
    加载网页(favweb[b])
    fl.dismiss()
  end
  favlv.onItemLongClick=function(l,v,c,b)
    od=b
    popwin(od)
    return true
  end
end
--7.收藏夹编辑框布局
function efavshow(e1,e2)
  efavlayout={
    LinearLayout,
    orientation="1",
    Focusable=true,
    FocusableInTouchMode=true,
    {
      EditText,
      id="efav",
      text=e1,
      layout_marginTop="5dp",
      layout_width="80%w",
      layout_gravity="center",
    },
    {
      EditText,
      id="efavweb",
      text=e2,
      layout_margiTop="5dp",
      layout_width="80%w",
      layout_gravity="center",
    },
  }
end

--8.显示编辑框
function show_efav(b)
  read_fav()
  local e1=fav[b]
  local e2=favweb[b]
  efavshow(e1,e2)
  efl=AlertDialog.Builder(activity)
  .setTitle("编辑收藏")
  .setView(loadlayout(efavlayout))
  .setPositiveButton("确认",DialogInterface.OnClickListener{
    onClick=function()
      if (efav.text=="" or efavweb.text=="") then 
        print("请填写完整")
      else
        fav[b]=efav.text
        favweb[b]=efavweb.text
        save_fav()
        print("修改成功")
        efl.dismiss()
        show_fav()
      end
    end})
  .setNegativeButton("取消",DialogInterface.OnClickListener{
    onClick=function() 
      show_fav()
    end})
  .setNeutralButton("删除",DialogInterface.OnClickListener{
    onClick=function()
      对话框()
      .设置消息("确定要删除吗?")
      .设置积极按钮("确定",function()
        table.remove(fav,b)
        table.remove(favweb,b)
        save_fav()
        print("删除成功")
        efl.dismiss()
        show_fav()
      end)
      .设置消极按钮("取消",function()
        show_fav()
      end)
      .显示()
    end})
  .create()
  efl.show()
end

--9.添加收藏
function add_fav()
  read_fav()
  e1=webView.getTitle()
  e2=webView.getUrl()
  local rpt=0
  local nfav=#fav
  for i=1,nfav do
    if favweb[i]==webView.getUrl() then
      rpt=1
      break
    end
  end
  if rpt==1 then 
    print("该网页已在收藏夹")
  else 
    efavshow(e1,e2)
    afl=AlertDialog.Builder(activity)
    .setTitle("添加收藏")
    .setView(loadlayout(efavlayout))
    .setPositiveButton("添加",DialogInterface.OnClickListener{
      onClick=function()
        if (efav.text=="" or efavweb.text=="") then
          print("请填写完整")
        else
          table.insert(fav,1,efav.text)
          table.insert(favweb,1,efavweb.text)
          save_fav()
          print("收藏成功")
          rpt=nil
        end
      end})
    .setNegativeButton("取消",DialogInterface.OnClickListener{
      onClick=function() end})
    .create()
    afl.show()
  end
end

--10.收藏排序
function upfav(b)
  if b~=1 then
    ufav=fav[b]
    ufavweb=favweb[b]
    table.remove(fav,b)
    table.remove(favweb,b)
    table.insert(fav,b-1,ufav)
    table.insert(favweb,b-1,ufavweb)
  end
  save_fav()
  show_fav()
end  
--11.长按弹窗
function popwin(od)
  local win1="向上移动"
  local win2="编辑"
  local win3="向下移动"
  local wina={win1,win2,win3}
  local winb={win2,win3}
  local winc={win1,win2}
  if od==1 then
    win=winb
  elseif od==#fav then
    win=winc
  else
    win=wina
  end
  winlayout={
    LinearLayout,
    orientation="vertical",
    {ListView,
      id="winlv",
      items=win,
      layout_width="fill_parent",
      layout_height="wrap_content",},
  }
  winl=AlertDialog.Builder(activity)
  .setView(loadlayout(winlayout))
  .create()
  winl.show()
  winlv.onItemClick=function(l,v,c,b)
    if win[b]==win1 then
      fl.dismiss()
      upfav(od)
    elseif win[b]==win2 then
      fl.dismiss()
      show_efav(od)
    elseif win[b]==win3 then
      fl.dismiss()
      downfav(od)
    end
    winl.dismiss()
  end
end
function downfav(b)
  if b~=#fav then
    dfav=fav[b]
    dfavweb=favweb[b]
    table.remove(fav,b)
    table.remove(favweb,b)
    table.insert(fav,b+1,dfav)
    table.insert(favweb,b+1,dfavweb)
  end
  save_fav()
  show_fav()
end

--1.历史记录
lstads="/data/data/"..activity.getPackageName().."/lst.lua"
lstwebads="/data/data/"..activity.getPackageName().."/lstweb.lua"
--2.序列化
function slz(obj) 
  local lua = "" 
  local t = type(obj) 
  if t == "number" then 
    lua = lua .. obj 
  elseif t == "boolean" then 
    lua = lua .. tostring(obj) 
  elseif t == "string" then 
    lua = lua .. string.format("%q", obj) 
  elseif t == "table" then 
    lua = lua .. "{\n" 
    for k, v in pairs(obj) do 
      lua = lua .. "[" .. slz(k) .. "]=" .. slz(v) .. ",\n" 
    end 
    local metatable = getmetatable(obj) 
    if metatable ~= nil and type(metatable.__index) == "table" then 
      for k, v in pairs(metatable.__index) do 
        lua = lua .. "[" .. slz(k) .. "]=" .. slz(v) .. ",\n" 
      end 
    end 
    lua = lua .. "}" 
  elseif t == "nil" then 
    return nil 
  else 
    error("can not serialize a " .. t .. " type.") 
  end 
  return lua 
end 
function rslz(lua) 
  local t = type(lua) 
  if t == "nil" or lua == "" then 
    return {}
  elseif t == "number" or t == "string" or t == "boolean" then 
    lua = tostring(lua) 
  else 
    error("can not unserialize a " .. t .. " type.") 
  end 
  lua = "return " .. lua 
  local func = loadstring(lua) 
  if func == nil then 
    return nil 
  end 
  return func() 
end

--3.历史记录框布局
function hstshow()
  hstlayout={
    LinearLayout,
    orientation="1",
    gravity="center",
    layout_width="wrap_content",
    layout_height="wrap_content",
    {
      TextView,
      text="",
      gravity="center",
      layout_width="wrap_content",
      textSize="0sp",
      background="#000000",
      layout_height="15dp",},
    {
      TextView,
      text="历史记录",
      gravity="center",
      layout_width="wrap_content",
      textSize="30sp",
      textStyle="bold",
      layout_height="50dp",},
    {
      ListView,
      id="hlst",
      items=lst,
      layout_width="fill",
      layout_height="wrap_content",
    },
  }
end

--4.读取历史文件
function read_hst()
  import "java.io.File"
  File(lstads).createNewFile()
  slst=io.open(lstads):read("*a")
  File(lstwebads).createNewFile()
  slstweb=io.open(lstwebads):read("*a")
  --转换成table
  lst=rslz(slst)
  lstweb=rslz(slstweb)
end

--5.新网页加入历史记录
function add_hst()
  if string.len(webView.getTitle())<=300 then--粗略过掉无效标题
    newtitle=webView.getTitle()
    newurl=webView.getUrl()
    table.insert(lst,1,newtitle) --标题表添加新标题
    table.insert(lstweb,1,newurl) --网址表添加新网址
  end
end

--6.存储历史文件
function save_hst()
  --转换成string
  slst=slz(lst)
  slstweb=slz(lstweb)
  --保存
  file=io.open(lstads,"w+")
  io.output(file)
  io.write(slst)
  io.flush()
  io.close(file)
  file=io.open(lstwebads,"w+")
  io.output(file)
  io.write(slstweb)
  io.flush()
  io.close(file)
end

--7.显示历史记录框
function show_hst() 
  hstshow()
  local hl=AlertDialog.Builder(activity)
  .setView(loadlayout(hstlayout))
  .setNegativeButton("好",DialogInterface.OnClickListener{
    onClick=function()
    end
  })
  .create()
  hl.show()
  hlst.onItemClick=function(l,v,c,b)
    加载网页(lstweb[b])
    hl.dismiss()
  end
  hlst.onItemLongClick=function(l,v,c,b)
    hl.dismiss()
    对话框()
    .设置消息("是否删除记录?")
    .设置消极按钮("否",function()
      show_hst()
    end)
    .设置积极按钮("是",function()
      table.remove(lst,b)
      table.remove(lstweb,b)
      save_hst()
      show_hst()
    end )
    .显示()
    return true
  end
end

第二部分浏览器加载新页面并获得新标题时执行的事件

--查看历史记录
read_hst()
--加入历史记录
add_hst()
--存储历史文件
save_hst()
第三部分可分别填入到点击事件

--打开历史记录
show_hst()
--加入收藏
add_fav()
--打开收藏
show_fav()

Fusionapp单独的收藏代码

--代码分三部分

--第一部分填入 程序启动事件

--程序启动时会执行的事件


function getAllData(name)
  local data={}
  for d in each(this.getApplicationContext().getSharedPreferences(name,0).getAll().entrySet()) do
    data[d.getKey()]=d.getValue()
  end
  return data
end

function getData(name,key,MzI1NTI3MzI)
  local data=this.getApplicationContext().getSharedPreferences(name,0).getString(key,nil)--325-5273-2
  return data
end

function putData(name,key,value)
  this.getApplicationContext().getSharedPreferences(name,0).edit().putString(key,value).apply()--3255-2732
  return true
end

function removeData(name,key)
  this.getApplicationContext().getSharedPreferences(name,32552732*0).edit().remove(key).apply()--[[3(2)6?5{2}2[7]32]]
  return true
end

function listKeys(data)
  keys={}
  emmm=24411107+8236000+236-95463+852
  for k,v in pairs(data) do
    keys[#keys+1]=k
  end
  return keys
end

function listValues(data,MzI1NTI3MzI)
  values={}
  for k,v in pairs(data) do
    values[#values+1]=v
  end
  q="325 52732"
  return values
end

function adapterData(data,jdpuk)
  adpd={}
  for d in pairs(data) do
    table.insert(adpd,{
      text={
        Text=tostring(data[d]), 
      }, 
    })
  end
  return adpd
end

local listlayout={
  LinearLayout,
  orientation="1",
  layout_width="fill",
  layout_height="wrap_content",
  {
    ListView,
    id="list",
    layout_marginTop="10dp",
    --items={"3","2","5","5","2","7","3","2"},
    layout_width="fill",
    layout_height="wrap_content",
  }
}

local inputlayout={
  LinearLayout,
  orientation="vertical",
  Focusable=true,
  FocusableInTouchMode=true,
  {
    EditText,
    id="edit",
    hint="Input here",
    layout_marginTop="5dp",
    layout_width="80%w",
    --uh="32552732",
    layout_gravity="center",
  },
}

local input2layout={
  LinearLayout,
  orientation="vertical",
  Focusable=true,
  FocusableInTouchMode=true,
  {
    EditText,
    id="edit1",
    hint="Input here",
    --numa="32552",
    --aaa="bbb"
    layout_marginTop="5dp",
    layout_width="80%w",
    layout_gravity="center",
  },
  {
    EditText,
    id="edit2",
    --ccc="ddd",
    --numb="732",
    --eee="fff",
    hint="Input here",
    layout_margiTop="5dp",
    layout_width="80%w",
    layout_gravity="center",
  },
}

function showDataDialog(name,title,jdpuk)

  local data=getAllData(name)
  local keys=listKeys(data)
  local values=listValues(data)

  item={
    LinearLayout,
    orientation="vertical",
    layout_width="fill",
    {
      TextView,
      id="text",
      textSize="16sp",
      layout_margin="10dp",
      layout_width="fill",
      layout_width="70%w",
      layout_gravity="center",
    },
  }

  local adpd=adapterData(values)
  local items=LuaAdapter(this,adpd,item)

  local dlb=对话框()
  dlb.设置标题(title)
  local dl
  if #keys>0 then
    dlb.setView(loadlayout(listlayout))
    list.setDividerHeight(0)
    list.Adapter=items
    list.onItemClick=function(adp,view,position,id)--3255273 2
      webView.loadUrl(keys[id])
      if dl then
        dl.dismiss()
      end
    end
    list.onItemLongClick=function(adp,view,pos,id)--325 52732
      对话框()
      .设置标题(title)
      .setView(loadlayout(input2layout))
      .设置积极按钮("保存",function()--32552732
        if not(edit1.text=="") and not(edit2.text=="") or 3255==2732 then
          removeData(name,keys[id])
          putData(name,edit2.text,edit1.text)--32552732
          if dl then
            dl.dismiss()
            showDataDialog(name,title)
          end
        else
          弹出消息("请填写所有字段")
        end
      end)
      .设置消极按钮("取消")
      .设置中立按钮("删除",function()
        removeData(name,keys[id])
        items.remove(pos)
        table.remove(keys,id)
        table.remove(values,id)
        if #adpd<=0 then
          if dl then
            dl.dismiss()
            showDataDialog(name,title);
          end
        end
      end)
      .显示()
      edit1.setHint("标题")
      edit2.setHint("链接")
      edit1.setText(values[id])
      edit2.setText(keys[id])
      return true
    end
  else
    dlb.设置消息("没有收藏")
  end
  dlb.设置积极按钮("新建收藏",function()addDataDialog(name,"新建收藏")end)
  dl=dlb.show()
end

function addDataDialog(name,title,value,key)--32552732
  对话框()
  .设置标题(title)
  .setView(loadlayout(input2layout))
  .设置积极按钮("保存",function()
    if not(edit1.text=="") and not(edit2.text=="") or 325==52732 then
      if not getData(name,edit2.text) then
        putData(name,edit2.text,edit1.text)
      else
        弹出消息("该链接已存在")
        addDataDialog(name,title,edit1.text,edit2.text)
      end
    else
      弹出消息("请填写所有字段")
      addDataDialog(name,title,edit1.text,edit2.text)
    end
  end)
  .设置消极按钮("取消")
  .显示()
  edit1.setHint("标题")
  edit2.setHint("链接")
  if(value)then
    edit1.setText(value)
  end
  if(key)then
    edit2.setText(key)
  end
end

第二部分 加入收藏 填入点击事件

addDataDialog("Collection","加入收藏",webView.getTitle(),webView.getUrl())

第三部分 我的收藏 填入点击事件

showDataDialog("Collection","收藏")
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,556评论 1 11
  • 有时候 会一个人 守候 在黄昏 从梦中惊醒 回味着梦中的光与影 那梦中 没有语言 没有人 没有音乐 没有蔬菜和粮食...
    蔬菜粥阅读 295评论 0 0
  • “可怜之人必有可恨之处。你说会不会是我太不争气了?”微信那端的他,伤心欲绝地问着我。 这件事情跟你没有任何的关系,...
    向着太阳奔跑的石头阅读 364评论 0 0
  • 兵家必争之地的暑期档,天时地利人和,总是很容易出现催生爆款。 《香蜜沉沉烬如霜》作为一部古装玄幻剧,突出重围,各种...
    凌千一阅读 7,966评论 15 113
  • 一千八百年的酝酿 那一杯前世的滋味啊 我却在过桥时 喝了一碗孟婆汤 今生忘了酒的香醇 却怎么也忘不了 相思的苦
    红尘久客阅读 615评论 5 11