【问题标题】:How to return a specific method on button click event?如何在按钮单击事件上返回特定方法?
【发布时间】:2019-05-29 22:10:46
【问题描述】:

两个按钮应该更新“Stickers.java”中的值“PACK_LIB”。

当他们覆盖字符串时,方法 setDefaultStickerPack() 应该重新启动。

单击按钮 b1 或 b2 时,值“PACK_LIB”将被值“allstickers”或“teststickers”覆盖。

按钮 b1 或 b2 如何在 setDefaultStickerPack() 中重新启动方法“if(in==null)”?

-------KeyboardService.java

 final Button button2 = (Button) mainBoard.findViewById(R.id.b2);
        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Stickers.PACK_LIB = "allstickers";
                stickers.setDefaultStickerPack();
                showStickers();
            }
        });

        final Button button3 = (Button) mainBoard.findViewById(R.id.b3);
        button3.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Stickers.PACK_LIB = "teststickers";
                stickers.setDefaultStickerPack();
                showStickers();
            }
        });

-------Stickers.java

public static String PACK_LIB ="";


public void setDefaultStickerPack() {
    checkVersion(true);
    InputStream in = null;
    String packList[]=new String[0];
    String PACK_APP="pack_app";
    String PACK_ICON="pack_on.png";
    String curAssets="";


    try {
        in = lContext.getAssets().open(PACK_APP+"/"+PACK_ICON);
        curAssets=PACK_APP;
        packList = lContext.getAssets().list(curAssets);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(in==null) {
        try {
            in = lContext.getAssets().open(PACK_LIB+"/"+PACK_ICON);
            curAssets=PACK_LIB;
            packList = lContext.getAssets().list(curAssets);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (in != null) {
        long packId = 1;
        PackData packData = new PackData();
        packData.objectId = packId;
        packData.name = "ROKOmoji";
        packData.iconOn = copyImgFile(in, "i" + packId + "_on");
        //packData.iconOff = copyImgFile(inOff, "i" + packId + "_off");
        List<StickerData> stickerData = new ArrayList<StickerData>();
        long i = 0;
        for (String img: packList) {
            if(PACK_ICON.equals(img)){
                continue;
            }
            InputStream sIs = null;
            try {
                sIs = lContext.getAssets().open(curAssets+"/"+img);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (sIs != null) {
                StickerData sd = new StickerData();
                i=i+1;
                File file = copyImgFile(sIs, "s" + img);
                sd.objectId = i;
                sd.imageId = i;
                sd.packId = packId;
                sd.packName = packData.name;
                sd.file = file;
                sd.iconKey = createIconKey(file, "si" + img);
                sd.mime = getMimeTypeOfFile(file.getPath());//"image/gif"
                sd.url = null;
                stickerData.add(sd);
            }
        }
        packData.stickers = stickerData;
        packDataListDefault.add(packData);
    }


}

【问题讨论】:

  • 您现有的代码出了什么问题?
  • "allstickers" 包括 20 个贴纸,而 "teststickers" 只有 5 个。当我单击“teststickers”按钮时,5 个贴纸显示在“allstickers”的 20 个贴纸下方。并且 20 个贴纸是不可见的。所以我需要向下滚动才能看到 5 个贴纸。 @okcomputer_kid
  • 尝试将 setDefaultStickerPack() 设为静态并调用 Stickers.setDefaultStickerPack() 而不是创建实例贴纸。 (我不确定这是否会有所帮助,我没有完全理解)
  • 如何使 setDefaultStickerPack() 静态?因为当我在代码中覆盖时,它会显示“此处不允许修改器”@okcomputer_kid

标签: java android android-studio button methods


【解决方案1】:

你可以调用带参数的方法。试试这个。

-------KeyboardService.java

final Button button2 = (Button) mainBoard.findViewById(R.id.b2);
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            stickers.setDefaultStickerPack("allstickers");
            showStickers();
        }
    });

    final Button button3 = (Button) mainBoard.findViewById(R.id.b3);
    button3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            stickers.setDefaultStickerPack("teststickers");
            showStickers();
        }
    });

-------Stickers.java

private static String PACK_LIB ="";

public void setDefaultStickerPack(String packLibValue) {
checkVersion(true);
InputStream in = null;
String packList[]=new String[0];
String PACK_APP="pack_app";
String PACK_ICON="pack_on.png";
String curAssets="";

PACK_LIB = packLibValue

try {
    in = lContext.getAssets().open(PACK_APP+"/"+PACK_ICON);
    curAssets=PACK_APP;
    packList = lContext.getAssets().list(curAssets);
} catch (IOException e) {
    e.printStackTrace();
}
if(in==null) {
    try {
        in = lContext.getAssets().open(PACK_LIB+"/"+PACK_ICON);
        curAssets=PACK_LIB;
        packList = lContext.getAssets().list(curAssets);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

..........
..........

}

【讨论】:

  • 我试过了,但结果相同。我发现当我关闭并再次启动该应用程序时它可以工作。但是我可以在按下按钮时重新启动应用程序吗? @M.S.T
  • 是的,你可以在按钮点击期间重新启动应用程序,只需编写此方法并在按钮点击时调用它@Override protected void onRestart() { super.onRestart(); } ---- onRestart(); stickers.setDefaultStickerPack("allstickers");显示贴纸();但这将是糟糕的编码,您可以尝试另一种方式,例如在您的 AndroidManifest 文件 android:alwaysRetainTaskState="false" 上添加以下行
猜你喜欢
  • 2013-01-21
  • 2014-02-20
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2013-04-01
相关资源
最近更新 更多