0

私のライブラリ プロジェクトの 1 つで魔法のようなことが起こっています。レイアウト (res/layout) はライブラリ プロジェクト自体から取得されますが、assets フォルダー内のファイルは (ライブラリ プロジェクトではなく) 呼び出し元のプロジェクトから取得されます。

現在、ライブラリ プロジェクトでヘルプ アクティビティを作成しています。呼び出し元のプロジェクトは、ライブラリ プロジェクト内のアクティビティにファイル名を指定します。ファイルは、ライブラリ プロジェクトではなく、呼び出し元のプロジェクトに保存されます。

ライブラリ プロジェクトで AssetsManager を使用すると、ライブラリ プロジェクトのアセット フォルダーからではなく、呼び出し元プロジェクトのファイルが使用されます。

これは正しい動作ですか?

ルート プロジェクトのアクティビティの呼び出しを簡略化したものを次に示します。

// Calling Project
package aa.bb.aa;

public class MyListActivity extends ListActivity {

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        setContentView(R.layout.mylistactivity); // <--- Stored in resources of the calling project
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        if (menuItem.getItemId() == R.id.men_help) {
            Intent intent = new Intent(this, aa.bb.bb.MyFileBrowser.class);
            intent.putExtra(MyConstants.FILE, "mylistactivity.html"); // <-- Stored in assets of the calling project
            startActivityForResult(intent, MyConstants.DIALOG_HELP);
            return true;
        }

        return super.onOptionsItemSelected(menuItem);
    }
}

ライブラリ プロジェクトのアクティビティは次のとおりです。アセットは、呼び出し元のアクティビティ/プロジェクトからではなく、ここからフェッチされると思いました:

// Library project
package aa.bb.bb;

    public class MyFileBrowser extends Activity {

        @Override
        public void onCreate(Bundle bundle) {
            super.onCreate(bundle);

            setContentView(R.layout.myfilebrowser); // <-- Stored in resources of the library project

            webView = (WebView) findViewById(R.id.browser);

            Locale locale = Locale.getDefault();
            String localeLanguage = (locale.getLanguage() != null) ? locale.getLanguage() : "en";

            Bundle bundleExtras = getIntent().getExtras();
            if (bundleExtras != null) {
                String file = bundleExtras.getString(MyConstants.FILE);
                if (!StringUtils.isEmpty(file)) {
                    String filename = "help-" + localeLanguage + File.separator + file;

                    AssetManager assetManager = getAssets();
                    InputStream inputStream = null;
                    try {
                        inputStream = assetManager.open(filename);
                    } catch (IOException ioException) {
                        filename = "help-en" + File.separator + file;
                    } finally {
                        try {
                            if (inputStream != null) {
                                inputStream.close();
                            }
                        } catch (IOException ioException) {
                        }
                    }

                    webView.loadUrl("file:///android_asset" + File.separator + filename); // <-- Uses file in assets of calling project - not library project
                }
            }
        }
    }
4

1 に答える 1

0

答えを見つけました。アセットは常に参照元プロジェクトから使用されます。ライブラリ プロジェクトはアセットを保持できません。このページで見つけました:

図書館プロジェクト

これについて説明しているドキュメントの一部を次に示します。

ツールは、ライブラリ プロジェクトでの未加工のアセット ファイル (assets/ ディレクトリに保存されている) の使用をサポートしていません。アプリケーションで使用されるすべてのアセット リソースは、アプリケーション プロジェクト自体の assets/ ディレクトリに格納する必要があります。ただし、res/ ディレクトリに保存されたリソース ファイルはサポートされています。

于 2012-08-30T12:54:23.053 に答える