第24回 設計変更。クラスって難しい。
前回、Runner クラスが便利そうだと書きましたが、進めているうちに、Runner クラスを統括していく、Team クラスがあるといいなと思いつき(私は常に思いつきでプログラムする・・・)、Team クラスを書いてみました。
Androidの記録方法、SharedPreferencesあたりを思い出すのに少しかかりましたが、ここに全て保存しようと思います。容量はそんなに大きくないです。
あと、Team クラスをView に渡そうと考えてましたが、これって逆ですよね。
Team クラスのアイテムとして、エントリービューや記録などがあるとスッキリするので、 Team クラスにViewを返すメソッドを実装することにしました。.
最後の方にある EntryView を返すメソッドがそれです。
これで、EntryView の”未登録”部分をタップした時、入力モードに移るようにすればなかなかいい感じなのではないかと思います。
import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.ScrollView; import java.util.ArrayList; public class Team { private Context myContext; private int lastId; // 登録メンバー数 private ArrayList<Runner> runners; // コンストラクタ Team(Context context) { myContext = context; lastId = loadLastId(); runners = new ArrayList<>(); // count(=登録数)が 0 の時は、名前の読み込みはしない if (lastId>0) { for (int i=1 ; i<=lastId ; i++ ) { runners.add(new Runner(i,myContext)); } } // 未登録枠を一つ作る runners.add(new Runner(lastId+1,myContext)); } private int loadLastId() { // ID番号は1からの連番で最終番号をプリファレンスに保存しておく // この関数は最終番号を読み出す // アプリ標準の Preferences を取得する SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(myContext); return sp.getInt("LastID",0); } private void saveLastId(int presentId) { // ID番号は1からの連番で最終番号をプリファレンスに保存しておく // この関数は最終番号を書き出す SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(myContext); // Preferences に書き込むための Editor クラスを取得する SharedPreferences.Editor editor = sp.edit(); editor.putInt("LastID",presentId); editor.apply(); } // 選手の追加・削除 void addRunner(String name) { // 氏名未登録のrunnerオブジェクトに氏名を入れて保存する runners.get(runners.size()).saveName(name); lastId++; saveLastId(lastId); // 未登録枠を一つ作る runners.add(new Runner(lastId+1,myContext)); } public EntryView entryMenuView(int width, int height) { ScrollView scrollView = new ScrollView(myContext); RunnerList listView = new RunnerList(myContext,width*8/10,width*13/100); // 選手名と番号を入れるメソッド for (int i=0; i<runners.size(); i++) { listView.setRunnerView(i+1,runners.get(i).getName()); } scrollView.addView(listView); return new EntryView(myContext, width,height,scrollView); } }
EntryView はこのようになっています。
import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; import android.util.TypedValue; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; public class EntryView extends RelativeLayout { public EntryView(Context context,int width, int height, ScrollView runnerEntryList) { // ランナーを指定する画面。 super(context); setBackgroundColor(Color.argb(255,100,240,255)); // このビューのサイズを受け取っておく // エントリー用のパーツを配置する // Entry(走者名の登録) TextView TextView title = new TextView(getContext()); title.setText("Entry(走者名の登録)"); final float size = width * 0.07f; title.setTextSize(TypedValue.COMPLEX_UNIT_PX,size); title.setTextColor(Color.BLACK); title.setTypeface(Typeface.DEFAULT_BOLD); LayoutParams titleParams = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); titleParams.addRule(ALIGN_PARENT_TOP); titleParams.addRule(CENTER_HORIZONTAL); this.addView(title,titleParams); // UIButton 2個、「メニューに戻る」「奏者選択終了」 // ボタンビューの位置決めをしたくないので、1個のViewに乗せてしまいます。 // ビューのサイズは下から15% EntryButtons buttons = new EntryButtons(getContext(),width,width*15/100); RelativeLayout.LayoutParams buttonsParams = new LayoutParams( width,width*15/100 ); buttonsParams.addRule(RelativeLayout.CENTER_IN_PARENT); buttonsParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); addView(buttons,buttonsParams); // スクロールビューの設置 RelativeLayout.LayoutParams SCViewParams = new LayoutParams( width*80/100,height-width*40/100 ); SCViewParams.addRule(CENTER_IN_PARENT); SCViewParams.addRule(CENTER_IN_PARENT); addView(runnerEntryList,SCViewParams); } }