Таблица рекордов

 V*D*V

Решение следующих задач:

Создать разметку экрана, в которой бы был

oсписок объектов

oстатический заголовок списка

oкнопки управления, находящиеся внизу, выровненные по ширине

oсписок объектов не должен заслоняться кнопками

Чтение/сохранение данных

Выделение строки рамкой

Прокручивание списка так, чтобы необходимая позиция стала видимой на экране

Запрет подсветки элемента списка

Обновление информации в списке

Разметка экрана

layout/record.xml

 

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="match_parent"

  android:layout_height="match_parent" >

 

  <TextView android:id="@+id/RecordHeader"

      android:layout_width="match_parent"

      android:layout_height="wrap_content"

      android:gravity="center_horizontal"

      android:textStyle="bold"

      android:text="@string/hs_header" />

  <LinearLayout android:id="@+id/Footer"

      android:orientation="horizontal"

      android:layout_width="match_parent"

      android:layout_height="wrap_content"

      android:layout_alignParentBottom="true">

      <Button android:id="@+id/MenuButton"

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:layout_weight="1"

          android:textStyle="bold"

          android:text="@string/btn_menu" />

      <Button android:id="@+id/ClearButton"

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:layout_weight="1"

          android:textStyle="bold"

          android:text="@string/btn_clear" />

  </LinearLayout>

  <ListView android:id="@+id/RecordList"

      android:layout_width="match_parent"

      android:layout_height="fill_parent"

      android:layout_centerVertical="true"

      android:layout_below="@id/RecordHeader"

      android:layout_above="@id/Footer" />

</RelativeLayout>

 

Заголовок списка - это текст, размещённый над списком.

 

Размещение списка так, чтобы его не заслоняли кнопки, достигается с помощью параметров

 

      android:layout_below="@id/RecordHeader"

      android:layout_above="@id/Footer"

 

Выравнивание кнопок по ширине достигается параметром кнопок

 

android:layout_weight="1"

 

Разметка экрана

Разметка экрана

 

Для форматирования вывода потребуется ещё один файл разметки

 

layout/record_item.xml

 

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:padding="10dp">

 

  <TextView android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_alignParentLeft="true"

      android:id="@+id/hs_name" />

  <TextView android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:layout_alignParentRight="true"

      android:id="@+id/hs_score" />

</RelativeLayout>

 

Вокруг строки может быть отрисована рамка. Чтобы зарезервировать для неё место, указан параметр

 

android:padding="10dp"

Выделение объекта рамкой

Рамка вокруг строки - это прямоугольник.

 

drawable-[dpi]/border.xml

 

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

  <solid android:color="#00000000" />

  <stroke android:width="2dp" android:color="#FF0000" />

</shape>

 

Прозрачный фон задаётся параметром

 

<solid android:color="#00000000" />

 

Толщина и цвет рамки

 

<stroke android:width="2dp" android:color="#FF0000" />

 

Далее в коде программы для устанавливаем его как фон:

 

 if( position == m_highlight_pos ) rowView.setBackgroundResource( R.drawable.border );

Сохранение/чтение данных

Хранение данные выполняем с помощью SharedPreferences.

Обновление списка

Для обновления списка на экране используем метод notifyDataSetChanged() класса RecordArrayAdapter.

Чтобы сделать позицию видимой, используем метод setSelection( position ) класса ListView.

Запрет подсветки элемента списка

 

 public class RecordArrayAdapter extends ArrayAdapter<String> {

         @Override

         public boolean isEnabled(int position) {// выключаем подсветку

                 return false;

         }

 }

Код

 

public class RecordActivity extends Activity implements OnClickListener {

 private static final int MAX_HISCORES = 10;

 private static final String DEFAULT_HISCORE_NAME = "...";

 

 public static String m_hiscore_names[] = new String[MAX_HISCORES];

 public static int m_hiscore_score[] = new int[MAX_HISCORES];

 

 private RecordArrayAdapter m_adapter = null;

 private ListView m_list = null;

 private int m_highlight_pos = -1;

 

 private MediaPlayer m_mp = null;

 

 public RecordActivity() {

         clear();

 }

 

 private void clear() {

         for( int i = 0; i < m_hiscore_names.length; i++ ) {

                 m_hiscore_names[i] = DEFAULT_HISCORE_NAME;

                 m_hiscore_score[i] = 0;

         }

 }

 private void load() {

         SharedPreferences prefs = getSharedPreferences( "PreferenceName", MODE_PRIVATE );

         for( int i = 0; i < m_hiscore_names.length; i++ ) {

                 m_hiscore_names[i] = prefs.getString( "Name" + i, DEFAULT_HISCORE_NAME );

                 m_hiscore_score[i] = prefs.getInt( "Score" + i, 0 );

         }

 }

 private void save() {

         SharedPreferences prefs = getSharedPreferences( "PreferenceName", MODE_PRIVATE );

         SharedPreferences.Editor ed = prefs.edit();

         for( int i = 0; i < m_hiscore_names.length; i++ ) {

                 ed.putString( "Name" + i, m_hiscore_names[i] )

                         .putInt( "Score" + i, m_hiscore_score[i] );

         }

         ed.commit();

 }

 @Override

 public void onCreate(Bundle savedInstanceState) {

         super.onCreate( savedInstanceState );

         setContentView( R.layout.record );

         setVolumeControlStream( AudioManager.STREAM_MUSIC );

         //

         Button btn = (Button)findViewById( R.id.MenuButton );

         btn.setOnClickListener( this );

         btn = (Button)findViewById( R.id.ClearButton );

         btn.setOnClickListener( this );

         //

         load();

         // Получаем число набранных очков

         Bundle bundle = getIntent().getExtras();

         if( bundle != null ) {

                 int scores = bundle.getInt( "Score" );

                 if( scores > 0 ) {// пробуем вставить новые данные в таблицу

                         int i = 0;

                         for( ; i < m_hiscore_score.length && scores < m_hiscore_score[i]; i++ ) {

                         }

                         if( i < m_hiscore_score.length ) {

                                 for( int j = MAX_HISCORES - 1; j > i; j-- ) {

                                         m_hiscore_score[j] = m_hiscore_score[j - 1];

                                         m_hiscore_names[j] = m_hiscore_names[j - 1];

                                 }

                                 m_hiscore_score[i] = scores;

                                 m_hiscore_names[i] = DEFAULT_HISCORE_NAME;

                                 m_highlight_pos = i;

                         }

                 }

         }

         m_adapter = new RecordArrayAdapter( this, m_hiscore_names );

         m_list = (ListView)findViewById( R.id.RecordList );

         m_list.setAdapter( m_adapter );

         // запрашиваем имя

         if( m_highlight_pos >= 0 ) {

                 final EditText input = new EditText( this );

                 new AlertDialog.Builder( this )

                         //.setTitle("Title")

                         .setMessage( R.string.hs_prompt )

                         // Устанавливаем EditText для получения ввода пользователя

                         .setView( input )

                         .setPositiveButton(

                                 R.string.btn_ok,

                                 new DialogInterface.OnClickListener() {

                                         public void onClick(DialogInterface dialog, int whichButton) {

                                                 m_hiscore_names[m_highlight_pos] = input.getText().toString();

                                                 m_adapter.notifyDataSetChanged();// обновляем экран

                                                 m_list.setSelection( m_highlight_pos );// делаем видимой

                                                 save();

                                         }

                                 }

                                 )

                         .show();

         }

 }

 @Override

 protected void onPause() {

         super.onPause();

         if( m_mp != null ) {

                 m_mp.stop();

                 m_mp.release();

         }

 }

 @Override

 public void onClick(View v) {

         if( m_mp != null ) {

                 m_mp.stop();

                 m_mp.release();

         }

         m_mp = MediaPlayer.create( this, R.raw.click );

         m_mp.start();

         switch( v.getId() ) {

         case R.id.MenuButton:

                 startActivity( new Intent( this, MenuActivity.class ).putExtra("menu", 1) );

                 finish();

                 break;

         case R.id.ClearButton:

                 new AlertDialog.Builder( this )

                 //.setTitle("Title")

                 .setMessage( R.string.hs_ask )

                 .setPositiveButton(

                                 R.string.btn_ok,

                                 new DialogInterface.OnClickListener() {

                                         public void onClick(DialogInterface dialog, int whichButton) {

                                                 clear();

                                                 save();

                                                 m_adapter.notifyDataSetChanged();// обновляем экран

                                         }

                                 }

                                 )

                 .setNegativeButton( R.string.btn_cancel, null )

                 .show();

                 break;

         }

 }

 

 public class RecordArrayAdapter extends ArrayAdapter<String> {

         private final Context m_context;

         private final NumberFormat m_nf;

 

         public RecordArrayAdapter(Context context, String[] values) {

                 super(context, R.layout.record_item, values);

                 m_context = context;

                 m_nf = NumberFormat.getInstance();

                 m_nf.setMinimumIntegerDigits( 6 );

         }

 

         @Override

         public View getView(int position, View convertView, ViewGroup parent) {

                 LayoutInflater inflater = (LayoutInflater) m_context

                                 .getSystemService( Context.LAYOUT_INFLATER_SERVICE );

                 View rowView = inflater.inflate( R.layout.record_item, parent, false );

                 if( position == m_highlight_pos ) rowView.setBackgroundResource( R.drawable.border );

                 TextView textView = (TextView) rowView.findViewById( R.id.hs_name );

                 textView.setText( m_hiscore_names[position] );

                 textView = (TextView) rowView.findViewById( R.id.hs_score );

                 textView.setText( m_nf.format( (long)m_hiscore_score[position] ) );

                 return rowView;

         }

         @Override

         public boolean isEnabled(int position) {// выключаем подсветку

                 return false;

         }

 }

}

 

Где хранится файл настроек?

Файл настроек хранится в образе диска эмулятора.

 

Запустить eclipse

Запустить эмулятор, для этого запустить отладку приложения кнопкой Debug

Открыть окно File Explorer. Для этого Window > Show View > Other > Android > File Explorer

 

В появившемся окне файл можно найти как

 

data/data/[package-name]/shared_prefs/[PrefName].xml

 

Используя команды в этом окне можно скопировать файл из/на устройство и удалить/добавить файл.

 

Если необходимо удалить каталог, сделать это можно следующим образом:

 

Запустить eclipse

Запустить эмулятор, для этого запустить отладку приложения кнопкой Debug

 

Запустить оболочку отладчика:

 

[android-sdk-path]\platform-tools\adb devices

List of devices attached

emulator-5554   device

 

[android-sdk-path]\platform-tools\adb -s emulator-5554 shell

#

 

Далее найти каталог командами ls и cd и удалить его командой rmdir.