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

では、最も簡単な方法でビュー(LinearViewとしましょう)内に追加するにはどうすればよいですか...

ありがとう!

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();

そして、その String を 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 に答える