2013年10月20日日曜日

eclipse でlayoutが表示されなくなる問題

突然、いつのまにか、 eclipse でlayoutが表示されなくなり、以下のメッセージが出る問題が発生しました。

activity_main.xml
>Missing styles. Is the correct theme chosen for this layout?
>Use the Theme combo box above the layout to choose a different layout, or fix the theme style references.
>
>Failed to find style 'spinnerStyle' in current theme
>Failed to find style 'textViewStyle' in current theme
>android.content.res.Resources$NotFoundException
>"?android:attr/listPreferredItemHeight" in attribute "minHeight" is not a valid format.
>Exception details are logged in Window > Show View > Error Log
>The following classes could not be found:
>- TextView (Change to android.widget.TextView, Fix Build Path, Edit XML)

(未解決)

spinnerStyle, textViewStyleを消しても解決しない。

結局、以下の手順で解決した。

・layoutのファイル、activity_main.xml の内容をコピーしておき
layoutのファイルを一度消す。

・念のため「Project」→「Clean」を実行しておく。

・「File」→「New」からlayoutのファイル、activity_main.xmlを新規作成する。
内容をペーストする。


根本の解決ではないが、ディレクトリの中身を比較しても違いがない。
でもこの手順で解決する。疑問。根本解決しない。

まずは、ファイルの作り直しで乗り切る事にする。

○追記
ただしい対処方法はeclipseの再起動でした。
なぜそれが必要になるのかは不明ですが

正しく記載されていれば再起動でなおります。

コードの記載の間違いの可能性を考えながらの場合は
なおしたらeclipse再起度して確認を繰り返せば解決する。

なぜなのかが残りますが、eclipseの対応が必要なのかな。期待します。

2013年10月19日土曜日

Activityのmenuを使う方法

Activityのmenuを使う方法です。

レイアウトはmenuで設定して、処理はActivityのメソッドをオーバーライドです。


○まず、menuのレイアウト例
 /res/menu/menu_samp.xml
 メニュー項目3つ。その1つめはサブメニュー付きにしてみた

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/item1" android:title="t1">
        <menu>
            <item android:id="@+id/item4" android:title="sub1"/>
            <item android:id="@+id/item5" android:title="sub2"/>
            <item android:id="@+id/item6" android:title="sub3"/>
        </menu>
    </item>
    <item android:id="@+id/item2" android:title="t2"></item>
    <item android:id="@+id/item3" android:title="t3"></item>
</menu>


○ソースコード
Activity のクラスの中に以下のメソッドを置く


    //メニューボタンが表示されたときのレイアウトを指定する
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = this.getMenuInflater();
        menuInflater.inflate(R.menu.menu_samp, menu);
        
        return true;
    }

    //ここで選択されたときの処理を入れる
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case R.id.item1 :
            return true;
        case R.id.item2 :
            return true;
        case R.id.item3 :
            return true;            
        case R.id.item4 : //sub1
            return true;
        case R.id.item5 : //sub2
            return true;
        case R.id.item6 : //sub3
            return true;
        }  
        return super.onMenuItemSelected(featureId, item);
    }



名前の付け方を工夫しないと数が多くなったときに困りそうですね。
細かいオプションはlayoutで指定できるのでらくそうです。

2013年9月29日日曜日

androidカスタムダイアログの作り方

androidでカスタムダイアログを作った例です。

○ソースコード




        LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
        final View viewSettingDialog = inflater.inflate(R.layout.setting_dialog, (ViewGroup)findViewById(R.id.layout_root));
        ((CheckBox)viewSettingDialog.findViewById(R.id.checkBoxVibrator)).setChecked(true);
        ((SeekBar)viewSettingDialog.findViewById(R.id.seekBarVolume)).setProgress(50);
        
        //
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(viewSettingDialog);
        builder.setPositiveButton("OK", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) { // OKボタンクリック処理
                boolean valVib = ((CheckBox)viewSettingDialog.findViewById(R.id.checkBoxVibrator)).isChecked();
                int valVol = ((SeekBar)viewSettingDialog.findViewById(R.id.seekBarVolume)).getProgress();
            }
        });
        builder.setNegativeButton("Cancel", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Cancel ボタンクリック処理
            }
        });
        builder.create().show();



○setting_dialog.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/option_volume" />
        <SeekBar
            android:id="@+id/seekBarVolume"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="100"
            android:padding="16dp"
            android:progress="50" />
        <CheckBox
            android:id="@+id/checkBoxVibrator"
            android:layout_width="308dp"
            android:layout_height="wrap_content"
            android:text="@string/option_vibrator" />
    </LinearLayout>




画面はeclipseでデザインできるので便利です。
その際に「LinearLayout」にID「layout_root」を付けておき、
その「layout_root」を「R.id.layout_root」と
もう一つ、「R.layout.setting_dialog」でinflateでViewで読み込んで表示します。

eclipseでデザインできるのが便利ですねえ。