0

コードをフォーマットして、最高のパフォーマンスを得て、プログラムで作成された複数のテキストビュー (セパレーターで区切られた 40 のテキストビュー段落) を処理するアクティビティの 1 つである、メモリ リークやアプリの動作の遅延を回避しようとしています。

Android開発に関する私の小さな知識として、以下のコードに到達しました。すべてのテキストビューは同じテキストの色、同じテキストサイズ、同じカスタムフォントと重力を持っていますが、文字列 xml のhtmlタグによってカスタマイズされた文字列のみが異なります。

以下のコードのように:

同じ目的を達成するためのより良い構築コードのフォーマットはありますか?

public class Text extends Activity {
 @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 Boolean customTitleSupported = requestWindowFeature (Window.FEATURE_CUSTOM_TITLE);      setContentView(R.layout.text);  
     if (customTitleSupported) { getWindow().setFeatureInt
           (Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title); }

    TextView tv = (TextView) findViewById(R.id.title_tv1); 
    Typeface face=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");     
    tv.setTypeface(face);
    tv.setText(" My Text ");  


    LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout);

        TextView tv1 = new TextView(this);
        tv1.setGravity(Gravity.CENTER);
        tv1.setTextSize(30);    
        tv1.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        ll.addView(tv1);
        tv1.setText(Html.fromHtml(getString(R.string.text1)));  

        ImageView divider1 = new ImageView(this);
        LinearLayout.LayoutParams lp1 = 
        new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp1.setMargins(10, 10, 10, 10);
        divider1.setLayoutParams(lp1);
        divider1.setBackgroundColor(Color.BLUE);
        ll.addView(divider1);

        TextView tv2 = new TextView(this);      
        tv2.setGravity(Gravity.RIGHT);
        tv2.setTextSize(30);
        tv2.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        ll.addView(tv2);
        tv2.setText(Html.fromHtml(getString(R.string.TEXT2)));

        ImageView divider2 = new ImageView(this);
        LinearLayout.LayoutParams lp2 = 
        new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp2.setMargins(10, 10, 10, 10);
        divider2.setLayoutParams(lp2);
        divider2.setBackgroundColor(Color.BLUE);
        ll.addView(divider2);

        TextView tv3 = new TextView(this);
        tv3.setGravity(Gravity.CENTER);
        tv3.setTextSize(30);
        tv3.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        ll.addView(tv3);
        tv3.setText(Html.fromHtml(getString(R.string.TEXT3)));

        ImageView divider3 = new ImageView(this);
        LinearLayout.LayoutParams lp3 = 
        new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp3.setMargins(10, 10, 10, 10);
        divider3.setLayoutParams(lp3);
        divider3.setBackgroundColor(Color.BLUE);
        ll.addView(divider3);

        TextView tv4 = new TextView(this);
        tv4.setGravity(Gravity.CENTER);
        tv4.setTextSize(30);    
        tv4.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        ll.addView(tv4);
        tv4.setText(Html.fromHtml(getString(R.string.TEXT4)));  

        ImageView divider4 = new ImageView(this);
        LinearLayout.LayoutParams lp4 = 
        new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp4.setMargins(10, 10, 10, 10);
        divider4.setLayoutParams(lp4);
        divider4.setBackgroundColor(Color.BLUE);
        ll.addView(divider4);

これは textview tv40 まで同じ方法で続きます。

次のようにカスタム フォントを追加します。

    public static class FontFactory {

            private static Typeface t1;

            public static Typeface getBFantezy(Context c) {
                if (t1 == null) {
                    t1 = Typeface.createFromAsset(c.getAssets(), "BFantezy.ttf");
                }
                return t1;
            }}

            }   

更新: 私はこのようにしようとしましたが、強制的に閉じました:

主な活動:

  public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String[] paragraphs = getResources().getStringArray(R.array.paragraphs);
    LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
    addParagraphs(layout, paragraphs);

    setContentView(R.layout.main);}

private void addParagraphs(LinearLayout layout, String[] paragraphs) {
    for (String paragraph : paragraphs) {
        TextView tv = new TextView(this);
        tv.setGravity(Gravity.CENTER);
        tv.setTextSize(30);   
        tv.setTextColor(Color.GREEN);
        tv.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        layout.addView(tv);
        tv.setText(paragraph);  

        ImageView divider = new ImageView(this);
        LinearLayout.LayoutParams params = new  
            LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        params.setMargins(10, 10, 10, 10);
        divider.setLayoutParams(params);
        divider.setBackgroundColor(Color.BLUE);
        layout.addView(divider); } 
                                }
                            }

フォントファクトリー:

public class FontFactory {

private static Typeface t1;

public static Typeface getBFantezy(Context c) {
    if (t1 == null) {
        t1 = Typeface.createFromAsset(c.getAssets(), "BFantezy.ttf");
    }
    return t1;
}}

ログキャット:

 FATAL EXCEPTION: main
   java.lang.RuntimeException: Unable to start activity  
ComponentInfo{com.test.demo/com.test.demo.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
      Caused by: java.lang.NullPointerException
at com.test.demo.MainActivity.addParagraphs(MainActivity.java:29)
at com.test.demo.MainActivity.onCreate(MainActivity.java:18)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
4

2 に答える 2

0

TextView区切り線として使用してこれを本当に実行したい場合はImageView、最初に段落の文字列配列を作成できます。

これをあなたの中に入れてください/res/values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="paragraphs">
        <item>Paragraph 1 content here</item>
        <item>Paragraph 2 content here</item>
        <item>Paragraph 3 content here</item>
<!-- And so on until how many paragraphs you like -->
    </string-array>
</resources>

次に、次のようにコードでこれらの段落を取得できます。

String[] paragraphs = getResources().getStringArray(R.array.paragraphs);

次に、次のような方法を使用できます。

private void addParagraphs(LinearLayout layout, String[] paragraphs) {
    for (String paragraph : paragraphs) {
        TextView tv = new TextView(this);
        tv.setGravity(Gravity.CENTER);
        tv.setTextSize(30);    
        tv.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        layout.addView(tv);
        tv.setText(paragraph);  

        ImageView divider = new ImageView(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        params.setMargins(10, 10, 10, 10);
        divider.setLayoutParams(params);
        divider.setBackgroundColor(Color.BLUE);

        layout.addView(divider);
    }
}

例を完成させるために、次のようにレイアウトに段落を設定できます。

String[] paragraphs = getResources().getStringArray(R.array.paragraphs);
LinearLayout layout = (LinearLayout) findViewById(R.id.yourLayout);
addParagraphs(layout, paragraphs);

編集:配置などの他の段落パラメーターを設定する場合はres/values/arrays.xml、段落文字列配列と同じ数のアイテムで別の文字列配列を作成し、メソッドにそれらを渡して、各段落番号にそれぞれ配置を設定できます。他にも方法はありますが、これはほんの一例です。クリエイティブになって楽しんでください。:)

于 2013-05-16T23:49:05.193 に答える