6

my でカスタム書体を提供するために、この例に従って拡張するクラスをここListActivityに書きました。CustomAdapterBaseAdapter

ただし、そこに記載されているように、getView()次のようにメソッドを記述しました。

public View getView(int position, View convertView, ViewGroup parent){
    String gameName = gameNames[position]; // gameName ist the String[] of the Custom Adapter

    TextView tv = new TextView(context);
    tv.setText(gameName);
    tv.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/gulim.ttf"));

    return tv;
}

これは意図したとおりに機能します。唯一気になる点は、リストが表示されるまでに約 3 ~ 4 秒かかることです (このコンテキストでは、これは非常に長い時間です)。ただし、次のように sListActivityを設定します。onItemClickListener

private void setOnItemClickListener(){
    getListView().setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int pos, long id){
            onClickEntryButton(((TextView) view).getText().toString());
        }
    });
}

private void onClickEntryButton(String gameName){
    Intent intent = new Intent(this, GameActivity.class);
    intent.putExtra("gameName", gameName);
    startActivity(intent);
    finish();
}

をクリックすると、が開くListItemまでにさらに時間がかかります。GameActivityこれは、SQLite データベースから取得した情報で満たされActivityたほんの数秒です。TextViewここでも、カスタムの書体を every に設定しますTextView。画面が2〜3秒間黒くなり(アプリがクラッシュしたように見えます)、新しいものがActivity表示されることさえあります. Activityこれは、アプリケーションの他の場所からアクセスする場合には発生しません。

どちらの場合でも - にアクセスする場合とから にListActivityアクセスする場合 -のカップルGameActivityListActivity

「szipinf - インフレ状態の初期化中」

メッセージは LogCat に表示されます。この文脈では、それらは何を意味するのでしょうか? onItemClickListenersgetView()を my のメソッドに設定する方が良いでしょうCustomAdapterか? 何かが実際に遷移を阻害しているように見えますが、計算または処理する大きなものがないため、何がわかりませんか (実際、SQLite データベースには、5 つのフィールドごとに正確に 2 つのエントリがあります)。

編集 必要に応じて、または必要に応じて、もちろん、より多くのコードを提供できます。

4

1 に答える 1

4

私はまったく同じ問題を抱えていましたが、あなたの質問に答えてくれました!

正確な根本原因はまだわかりませんが、これは、私の場合、アセットからカスタム フォントを複数回読み取るためです。画面に 10 個のウィジェットがあり、それぞれがカスタム フォントを使用している場合、Android は毎回アセットからそれをロードします。これは、アクティビティの遷移が遅くなるだけでなく、複数回遊んだ後にクラッシュする原因にもなりました。

そこで、アセットから毎回書体を取得することを避けるために、書体のキャッシュを作成しました。

このコードをユーティリティ クラス内に追加しました。

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

public static final String ASSET_PATH="assetPath";

public static Typeface getFont(Context c, String assetPath) {
    synchronized (cache) {
        if (!cache.containsKey(assetPath)) {
            try {
                Typeface t =(Typeface.createFromAsset(c.getAssets(),
                        "fonts/arial.ttf"));
                cache.put(assetPath, t);
            } catch (Exception e) {
                return null;
            }
        }
        return cache.get(assetPath);
    }
}

setTypeface にカスタム クラスを作成しました

public class MyButton extends Button {

public MyButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public MyButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyButton(Context context) {
    super(context);
}

@Override
public void setTypeface(Typeface tf) {

    super.setTypeface(Util.getFont(getContext(), Util.ASSET_PATH));
}

}

変数 assetPath を使用して、実行時に異なるフォントを提供できます

編集:これは、より汎用的にするためにライブラリとして作成したカスタム typefaceManager です

于 2014-03-12T10:47:35.137 に答える