Как добавить AppWidget внутрь представления?

Я хочу добавить виджет приложения поиска по умолчанию в представление внутри моего приложения. Точно так же, как домашний экран, но без перетаскивания, и я хочу, чтобы рабочее пространство было размером 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;
 }

Итак, как я могу добавить его в представление (скажем, LinearView) самым простым способом...

Спасибо!


person Alioooop    schedule 11.09.2012    source источник


Ответы (1)


Используйте AppWidgetHost. На самом деле мне это нужно было для хранения и чтения имени пакета виджета. Видишь ли, мы оба помогли. AppWidgetHost можно реализовать для добавления в LnearLayout. Я бы использовал RelativeLayout на вашем месте, поскольку RelativeLayout позволяет создавать настраиваемые области, если вы хотите, чтобы они были центрированы, тогда вы можете это сделать. Если вы не используете LinearLayout внутри RelativeLayout.

Вот как это реализовано:

Вы можете отредактировать это и изменить его так, как вам нравится. Вызов «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);

Теперь вы внедряете этот идентификатор в этот код:

 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 ++;
}

Это добавит выбранный виджет в макет.

person Az Weekly    schedule 14.02.2016