編輯:關於Android編程
先放兩張效果圖
在此處創建的plugin工程,如下圖所示
填寫完工程名之後, 創建的工程結構如下所示
其中plugin.xml就和j2ee中web.xml功能類似,是配置插件屬性的地方。
首先,new一個Action,在彈出界面簡單填寫類的信息,如下圖
其中第一部分是類相關的信息,ActionID表示一個獨一無二的名字,就像Android清單文件中的包名一樣。
第二部分是將這個功能添加到哪個菜單中去,當前選擇的是添加到Edit菜單中並且作為第一個子菜單。
第三部分是這個功能的快捷鍵,可將光標置於輸入框內,點擊鍵盤進行輸入
可以看到在生成的類中有public void actionPerformed(AnActionEvent e) 這個方法,關鍵的地方就在這個方法中,在IDE中幾乎所有操作都可以在此方法中捕捉到。如下圖
首先獲取選中的文字,調用以下api
final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
if (null == mEditor) {
return;
}
SelectionModel model = mEditor.getSelectionModel();
final String selectedText = model.getSelectedText();
if (TextUtils.isEmpty(selectedText)) {
return;
}
獲取到選中的文字之後,就可以調用申請到的有道翻譯接口進行翻譯,要翻譯的文本,必須是UTF-8編碼,字符長度不能超過200個字符,需要進行urlencode編碼。翻譯完成之後就可以以一個類似popupWindow的窗口將接口展示出來了。
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
JBPopupFactory factory = JBPopupFactory.getInstance();
factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
.setFadeoutTime(5000)
.createBalloon()
.show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
}
});
}
點擊綠色運行按鈕,測試成功後就可以生成安裝包了。在Build菜單中選擇 Prepare Plugin Module ‘your project name’ For Deployment就可以生成安裝包了。
我只是為了自己用,所以沒有在plugin.xml文件中添加更多的詳細信息,至於怎麼發布到插件庫,還請大家自行google,下面是完整的代碼。點擊這裡下載我編譯好的插件,zip格式的。
完整代碼如下:
action 類
import com.google.gson.Gson;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.ui.JBColor;
import org.apache.http.util.TextUtils;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
/**
* Created by huangyuan on 16-7-16.
*/
public class TranslateAction extends AnAction {
//有道翻譯接口
private String translateUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=AS-TranslatePlugin&key=your key&type=data&doctype=json&version=1.1&q=%s";
public void actionPerformed(AnActionEvent e) {
final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
if (null == mEditor) {
return;
}
SelectionModel model = mEditor.getSelectionModel();
//獲取選中的文字
final String selectedText = model.getSelectedText();
if (TextUtils.isEmpty(selectedText)) {
return;
}
// Messages.showMessageDialog(selectedText, "選中的文字", Messages.getInformationIcon());
TranslateBean translateBean = doTranslate(selectedText);
showPopupBalloon(mEditor,translateBean.toString());
}
/**
*
* @param translateText 需要翻譯的文本
* @return TranslateBean 翻譯完成後轉換為對象
* 調用翻譯接口,將返回的數據用Gson封裝為對象
*/
private TranslateBean doTranslate(String translateText) {
Gson gson = new Gson();
InputStream is = null;
StringBuffer resultData = new StringBuffer();
try {
URL url = new URL(String.format(translateUrl, URLEncoder.encode(translateText,"utf-8")));
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setDoInput(true); //允許輸入流,即允許下載
httpURLConnection.setDoOutput(true); //允許輸出流,即允許上傳
httpURLConnection.setUseCaches(false); //不使用緩沖
httpURLConnection.setRequestMethod("GET"); //使用get請求
is = httpURLConnection.getInputStream(); //獲取輸入流,此時才真正建立鏈接
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bufferReader = new BufferedReader(isr);
String inputLine = "";
while((inputLine = bufferReader.readLine()) != null){
resultData.append(inputLine);
}
System.out.println(resultData.toString());
TranslateBean translateBean = gson.fromJson(resultData.toString(), TranslateBean.class);
return translateBean;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
*
* @param editor Edit
* @param result 要展示的文字
* 以類似popupwindow的形式展示,別問我為什麼這麼寫,我也不知道,我是抄的api
*/
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
JBPopupFactory factory = JBPopupFactory.getInstance();
factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
.setFadeoutTime(5000)
.createBalloon()
.show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
}
});
}
}
TranslateBean
import java.util.List;
/**
* Created by huangyuan on 16-7-17.
*/
public class TranslateBean {
private BasicBean basic;
private String query;
private int errorCode;
private List translation;
private List web;
public BasicBean getBasic() {
return basic;
}
public void setBasic(BasicBean basic) {
this.basic = basic;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public List getTranslation() {
return translation;
}
public void setTranslation(List translation) {
this.translation = translation;
}
public List getWeb() {
return web;
}
public void setWeb(List web) {
this.web = web;
}
public static class BasicBean {
private List explains;
private String phonetic;
public String getPhonetic() {
return phonetic;
}
public void setPhonetic(String phonetic) {
this.phonetic = phonetic;
}
public List getExplains() {
return explains;
}
public void setExplains(List explains) {
this.explains = explains;
}
}
public static class WebBean {
private String key;
private List value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List getValue() {
return value;
}
public void setValue(List value) {
this.value = value;
}
}
@Override
public String toString() {
StringBuffer webStringBuffer = new StringBuffer();
for(int i =0;i
項目下載地址:https://github.com/Aiushtha/android-PictureSelector最早使用android調用系統拍照然後遇到很多空指針等
前言:本來我是做電視應用的,但是因為公司要出手機,人員緊張,所以就抽調我去支援一下,誰叫俺是雷鋒呢!我做的一個功能就是處理手機中的應用ICON,處理無非就是美化一下,重新
前言 在做移動開發過程中底部導航欄是十分常見的功能,且市面上見到的做法也有很多種,這篇博文記錄一下使用Fragment實現底部導航欄的功能,算是對這幾天學習Andr
您可下載源碼,運行看效果:點擊打開鏈接 一)切換為英文的代碼: Locale.setDefault(Locale.ENGLISH); Configuration c