1

我想将默认搜索应用小部件添加到我的应用内的视图中。就像主屏幕一样,但没有任何拖动,我只希望工作区是 4x1 大。

我怎样才能做到这一点?我已经查看了启动器的来源,但它有很多需要理解和删除,因为我希望它尽可能简单......

我知道我可以像这样获取小部件的组件名称:

private ComponentName getSearchWidgetProvider() {
    SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
    ComponentName searchComponent = null;
    searchManager.getSearchableInfo(searchComponent);
    if (searchComponent == null) return null;
    return getProviderInPackage(searchComponent.getPackageName());
}

private ComponentName getProviderInPackage(String packageName) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
    List<AppWidgetProviderInfo> providers = appWidgetManager.getInstalledProviders();
    if (providers == null) return null;
    final int providerCount = providers.size();
    for (int i = 0; i < providerCount; i++) {
        ComponentName provider = providers.get(i).provider;
        if (provider != null && provider.getPackageName().equals(packageName)) {
            return provider;
        }
    }
    return null;
 }

那么我怎样才能以最简单的方式将它添加到视图中(让我们说一个线性视图)......

谢谢!

4

1 回答 1

0

使用 AppWidgetHost。我实际上需要它来存储和读取小部件的包名。看,我们都帮忙了。AppWidgetHost 可以实现添加到 LnearLayout。如果我是你,我会使用RelativeLayout,因为RelativeLayout 允许自定义区域本身,如果你希望它居中,那么你可以。除非您在 RelativeLayout 中使用 LinearLayout。

以下是它的实现方式:

您可以编辑它并将其更改为您喜欢的方式。调用“appWidgetId”是为每个小部件提供的 int。您可以存储它,然后让您的应用程序检查存储的文件是否存在,读取它,将文本转换为字符串,然后将字符串转换为 int。

存储信息:

String path="/sdcard/widget.txt";
//You can change the path to whatever you want it to be
File f=new File(path);
try{
 FileWriter fw=new FileWriter(f);
 fw.write("whatever text");
 fw.flush();
 fw.close();
}catch(IOException e){
 e.printStackTrace();
}

现在要读取文件,您必须调用 StringBuilder、BufferedReader 和 String 行来获取信息。

File f=new File("/sdcard/widget.txt");
//the path must be where you stored the files
StringBuilder sb=new StringBuilder();
try{
BufferedReader br=new BufferedReader(new FileReader(f));
String line;
while((line=br.readLine())!=null){
sb.append(line);
sb.append('\n');
}
br.close();
}catch(IOException e){
e.printStackTrace();
}

现在您只需将文本转换为字符串:

String widId=sb.toStrng();

然后将该字符串转换为 int:

int wid=Integer.parseInt(widId);

现在您在此代码中实现该 ID:

 public void createWidget(Intent data) {
    Bundle extras = data.getExtras();
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(rl.getWidth(), rl.getHeight()/3);
    lp.topMargin = numWidgets * (rl.getHeight()/3);
    AppWidgetHostView hostView = mAppWidgetHost.createView(getActivity().getApplicationContext(), appWidgetId, appWidgetInfo);
    hostView.setAppWidget(widID,appWidgetInfo);
    rl.addView(hostView, lp);
    hostView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });
    numWidgets ++;
}

这会将选定的小部件添加到布局中。

于 2016-02-14T01:21:25.393 回答