PC版ではiniに設定ファイルを保存していたのをAndroidで使われるpreferenceから設定を書き換える。
あなた:
次のiniからandroid向けのpreference画面を作って
#AozoraEpub3 Parameters #Thu Oct 10 00:33:19 GMT+09:00 2024 AutoFileName=1 AutoMargin= AutoMarginLimitH=15 AutoMarginLimitV=15 AutoMarginNombre=0 AutoMarginNombreSize=3.0 AutoMarginPadding=1.0 AutoMarginWhiteLevel=80 AutoYoko=1 AutoYokoEQ1= AutoYokoNum1= AutoYokoNum3= BodyMargin=0,0,0,0 BodyMarginUnit=0 BoldUseGothic= CachePath=.cache ChapterExclude=1 ChapterH=1 ChapterH1=1 ChapterH2=1 ChapterH3=1 ChapterName=1 ChapterNumOnly= ChapterNumParen= ChapterNumParenTitle= ChapterNumTitle= ChapterPattern= ChapterPatternText= ChapterSection=1 ChapterUseNextLine= ChkConfirm=1 ChukiRuby=0 CommentConvert= CommentPrint= Cover= CoverH=0 CoverHistory= CoverPage=1 CoverPageToc= CoverW=0 DakutenType=2 DispH=2560 DispW=1600 DividerLocation=230 DstPath=C\:\\Users\\Owner\\Downloads DstPathList=C\:\\Users\\Owner\\Downloads EncType=0 Ext=.mobi+.epub FitImage= FontSize=100 ForceIndent= Gamma= GammaValue=1.0 GothicUseBold= ImageFloat= ImageFloatBlock= ImageFloatH=400 ImageFloatPage= ImageFloatType=0 ImageFloatW=600 ImageScale=1.0 ImageScaleChecked= ImageSizeType=1 IvsBMP= IvsSSP= JpegQuality=85 LangType=ja LastDir= LineHeight=1.5 MarkId= MaxChapterNameLength=64 MaxCoverLine= MaxEmptyLine=0 NavNest=1 NcxNest=1 NoIllust= OverWrite=1 PageBreak= PageBreakChapter= PageBreakChapterSize=200 PageBreakEmpty= PageBreakEmptyLine=2 PageBreakEmptySize=300 PageBreakSize=400 PageMargin=0,0,0,0 PageMarginUnit=0 PosX=626.0 PosY=507.0 ProfileFileName=20230320-214852.ini ProfileList=20230320-214852.ini PubFirst= RemoveEmptyLine=0 ReplaceCover= ResizeH= ResizeNumH=2048 ResizeNumW=2048 ResizeW= RotateImage=0 SameLineChapter= SamePath= SinglePageSizeH=300 SinglePageSizeW=200 SinglePageWidth=300 SizeH=458.0 SizeW=540.0 SpaceHyphenation=1 SvgImage= TitlePage=1 TitlePageWrite=1 TitleToc=1 TitleType=0 TocPage= TocVertical=1 UseFileName= UserAgent=Chrome Vertical=1 WebBeforeChapter= WebBeforeChapterCount=1 WebConvertUpdated= WebInterval=0.5 WebModifiedExpire=24 WebModifiedOnly= WebModifiedTail= jCheckWebLageImage=
ChatGPT:
この .ini ファイルに基づいて、Android 向けの PreferenceScreen を作成します。 Android の Preference 画面は res/xml/preferences.xml に定義し、PreferenceFragmentCompat を使って表示するのが一般的です。
以下は、ini の設定を反映した PreferenceScreen の XML です。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ファイル関連 -->
<SwitchPreferenceCompat
android:key="AutoFileName"
android:title="自動ファイル名"
android:defaultValue="true" />
<EditTextPreference
android:key="DstPath"
android:title="保存先"
android:dialogTitle="保存先を入力"
android:defaultValue="C:\\Users\\Owner\\Downloads" />
<ListPreference
android:key="Ext"
android:title="出力フォーマット"
android:dialogTitle="フォーマットを選択"
android:entries="@array/ext_options"
android:entryValues="@array/ext_values"
android:defaultValue=".mobi+.epub" />
<!-- 画像関連 -->
<SwitchPreferenceCompat
android:key="FitImage"
android:title="画像をページにフィット" />
<SeekBarPreference
android:key="JpegQuality"
android:title="JPEG品質"
android:max="100"
android:min="0"
android:defaultValue="85" />
<!-- 文字・レイアウト関連 -->
<SeekBarPreference
android:key="FontSize"
android:title="フォントサイズ"
android:max="200"
android:min="50"
android:defaultValue="100" />
<SwitchPreferenceCompat
android:key="Vertical"
android:title="縦書き" />
<SeekBarPreference
android:key="LineHeight"
android:title="行間"
android:max="3"
android:min="1"
android:defaultValue="1.5"
android:float="true" />
<!-- その他の設定 -->
<SwitchPreferenceCompat
android:key="OverWrite"
android:title="ファイルを上書き"
android:defaultValue="true" />
</PreferenceScreen>
res/values/arrays.xml を作成し、リスト選択肢を定義します。
<resources>
<string-array name="ext_options">
<item>MOBI + EPUB</item>
<item>EPUBのみ</item>
<item>MOBIのみ</item>
</string-array>
<string-array name="ext_values">
<item>.mobi+.epub</item>
<item>.epub</item>
<item>.mobi</item>
</string-array>
</resources>
PreferenceFragmentCompat を使って設定画面を作ります。
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
}
}
SettingsFragment を MainActivity に表示する。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager.beginTransaction()
.replace(android.R.id.content, SettingsFragment())
.commit()
}
}
この PreferenceScreen は .ini ファイルの主要な設定項目を Android の設定画面に落とし込んだものです。 細かい調整は、必要に応じて SeekBarPreference の max 値や ListPreference の選択肢を変更してください。
あなた:
javaでandroid向けのpreferenceの作り方
ChatGPT:
Java で Android 向けの PreferenceScreen を作成する方法を解説します。 PreferenceFragmentCompat を使って、設定画面を実装します。
まず、設定画面のレイアウトを定義します。 res/xml/preferences.xml に次の内容を追加してください。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ファイル関連 -->
<SwitchPreferenceCompat
android:key="AutoFileName"
android:title="自動ファイル名"
android:defaultValue="true" />
<EditTextPreference
android:key="DstPath"
android:title="保存先"
android:dialogTitle="保存先を入力"
android:defaultValue="C:\\Users\\Owner\\Downloads" />
<ListPreference
android:key="Ext"
android:title="出力フォーマット"
android:dialogTitle="フォーマットを選択"
android:entries="@array/ext_options"
android:entryValues="@array/ext_values"
android:defaultValue=".mobi+.epub" />
<!-- 画像関連 -->
<SwitchPreferenceCompat
android:key="FitImage"
android:title="画像をページにフィット" />
<SeekBarPreference
android:key="JpegQuality"
android:title="JPEG品質"
android:max="100"
android:min="0"
android:defaultValue="85" />
<!-- 文字・レイアウト関連 -->
<SeekBarPreference
android:key="FontSize"
android:title="フォントサイズ"
android:max="200"
android:min="50"
android:defaultValue="100" />
<SwitchPreferenceCompat
android:key="Vertical"
android:title="縦書き" />
<SeekBarPreference
android:key="LineHeight"
android:title="行間"
android:max="3"
android:min="1"
android:defaultValue="1.5"
android:useSimpleSummaryProvider="true" />
<!-- その他の設定 -->
<SwitchPreferenceCompat
android:key="OverWrite"
android:title="ファイルを上書き"
android:defaultValue="true" />
</PreferenceScreen>
ListPreference で使用するリストを res/values/arrays.xml に定義します。
<resources>
<string-array name="ext_options">
<item>MOBI + EPUB</item>
<item>EPUBのみ</item>
<item>MOBIのみ</item>
</string-array>
<string-array name="ext_values">
<item>.mobi+.epub</item>
<item>.epub</item>
<item>.mobi</item>
</string-array>
</resources>
PreferenceFragmentCompat を拡張して設定画面を作成します。
package com.example.myapp;
import android.os.Bundle;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
}
}
設定画面を Activity として開けるようにします。
package com.example.myapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
アプリの設定画面を開けるように AndroidManifest.xml に SettingsActivity を登録します。
<activity android:name=".SettingsActivity"
android:label="設定"
android:parentActivityName=".MainActivity">
</activity>
例えば MainActivity.java にボタンを追加し、クリックすると SettingsActivity を開くようにします。
package com.example.myapp;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button settingsButton = findViewById(R.id.settings_button);
settingsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(intent);
}
});
}
}
res/layout/activity_main.xml にボタンを配置します。
<Button
android:id="@+id/settings_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="設定を開く" />
アプリ内で設定値を取得するには SharedPreferences を使います。
import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
// 設定値を取得する例
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean autoFileName = prefs.getBoolean("AutoFileName", true);
String dstPath = prefs.getString("DstPath", "C:\\Users\\Owner\\Downloads");
int fontSize = prefs.getInt("FontSize", 100);
- XML で PreferenceScreen を定義
- SettingsFragment で PreferenceFragmentCompat を継承
- SettingsActivity で設定画面を表示
- MainActivity のボタンから SettingsActivity を開く
- SharedPreferences で設定値を取得
XML で PreferenceScreen を定義
SettingsFragment で PreferenceFragmentCompat を継承
SettingsActivity で設定画面を表示
MainActivity のボタンから SettingsActivity を開く
SharedPreferences で設定値を取得
この方法で、Android の設定画面を Java で実装できます! 🚀
あなた:
次のコードをandroidのpreferenceに書き換えて
/** propsの値をアプレットに設定 */
private void loadProperties(Properties props)
{
boolean selected;
//表題
if(props.getProperty("TitleType")!=null){
jComboTitle.setSelectedIndex(Integer.parseInt(props.getProperty("TitleType")));};
setPropsSelected(jCheckPubFirst, props, "PubFirst");
setPropsSelected(jCheckUseFileName, props, "UseFileName");
//表紙
if (props.getProperty("Cover")==null|| props.getProperty("Cover").isEmpty()) jComboCover.setSelectedIndex(0);
else jComboCover.setSelectedItem(props.getProperty("Cover"));
//表紙履歴
setPropsSelected(jCheckCoverHistory, props, "CoverHistory");
//有効行数
setPropsIntText(jTextMaxCoverLine, props, "MaxCoverLine");
setPropsSelected(jCheckCoverPage, props, "CoverPage");
//表題ページ
setPropsSelected(jCheckTitlePage, props, "TitlePageWrite");
String propValue = props.getProperty("TitlePage");
if (propValue != null) {
jRadioTitleNormal.setSelected(Integer.toString(BookInfo.TITLE_NORMAL).equals(propValue));
jRadioTitleMiddle.setSelected(Integer.toString(BookInfo.TITLE_MIDDLE).equals(propValue));
jRadioTitleHorizontal.setSelected(Integer.toString(BookInfo.TITLE_HORIZONTAL).equals(propValue));
}
setPropsSelected(jCheckTocPage, props, "TocPage");
selected = setPropsSelected(jRadioTocV, props, "TocVertical");
jRadioTocH.setSelected(!selected);
//出力ファイル設定
//拡張子
if (props.getProperty("Ext") != null && !props.getProperty("Ext").isEmpty())
jComboExt.setSelectedItem(props.getProperty("Ext"));
//出力ファイル名設定
setPropsSelected(jCheckAutoFileName, props, "AutoFileName");
//ファイルの上書き許可
setPropsSelected(jCheckOverWrite, props, "OverWrite");
//栞用ID出力
setPropsSelected(jCheckMarkId, props, "MarkId");
//4バイト文字を変換する
//setPropsSelected(jCheckGaiji32, props, "Gaiji32");
//縦書き横書き
selected= setPropsSelected(jRadioVertical, props, "Vertical");
jRadioHorizontal.setSelected(!selected);
//入力文字コード
if(props.getProperty("EncType")!=null){
jComboEncType.setSelectedIndex(Integer.parseInt(props.getProperty("EncType"))); }
//言語設定
if (props.getProperty("LangType") != null && !props.getProperty("LangType").isEmpty())
jComboLangType.setSelectedItem(props.getProperty("LangType"));
////////////////////////////////////////////////////////////////
//画像設定
setPropsSelected(jCheckNoIllust, props, "NoIllust");
//画面サイズ
setPropsIntText(jTextDispW, props, "DispW");
setPropsIntText(jTextDispH, props, "DispH");
//表紙サイズ
setPropsIntText(jTextCoverW, props, "CoverW");
setPropsIntText(jTextCoverH, props, "CoverH");
//画像単ページ化
setPropsIntText(jTextSinglePageSizeW, props, "SinglePageSizeW");
setPropsIntText(jTextSinglePageSizeH, props, "SinglePageSizeH");
//横のみ
setPropsIntText(jTextSinglePageWidth, props, "SinglePageWidth");
//サイズ指定
propValue = props.getProperty("ImageSizeType");
if (propValue != null) {
jRadioImageSizeType1.setSelected(Integer.toString(SectionInfo.IMAGE_SIZE_TYPE_AUTO).equals(propValue));
jRadioImageSizeType3.setSelected(Integer.toString(SectionInfo.IMAGE_SIZE_TYPE_ASPECT).equals(propValue));
}
//拡大しない
setPropsSelected(jCheckFitImage, props, "FitImage");
//SVG画像タグ出力
setPropsSelected(jCheckSvgImage, props, "SvgImage");
if(props.getProperty("RotateImage")!=null){ jComboRotateImage.setSelectedIndex(Integer.parseInt(props.getProperty("RotateImage"))); }
//画像倍率
setPropsSelected(jCheckImageScale, props, "ImageScaleChecked", false);
setPropsFloatText(jTextImageScale, props, "ImageScale");
//画像回り込み
setPropsSelected(jCheckImageFloat, props, "ImageFloat");
setPropsIntText(jTextImageFloatW, props, "ImageFloatW");
setPropsIntText(jTextImageFloatH, props, "ImageFloatH");
if(props.getProperty("ImageFloatType")!=null){ jComboImageFloatType.setSelectedIndex(Integer.parseInt(props.getProperty("ImageFloatType"))); }
//画像縮小指定
setPropsSelected(jCheckResizeW, props, "ResizeW");
setPropsIntText(jTextResizeNumW, props, "ResizeNumW");
setPropsSelected(jCheckResizeH, props, "ResizeH");
setPropsIntText(jTextResizeNumH, props, "ResizeNumH");
//Float表示 (デフォルトOFF)
setPropsSelected(jCheckImageFloatPage, props, "ImageFloatPage", false);
setPropsSelected(jCheckImageFloatBlock, props, "ImageFloatBlock", false);
//Jpeg圧縮率
setPropsIntText(jTextJpegQuality, props, "JpegQuality");
//ガンマ補正
setPropsSelected(jCheckGamma, props, "Gamma");
setPropsFloatText(jTextGammaValue, props, "GammaValue");
//余白除去
setPropsSelected(jCheckAutoMargin, props, "AutoMargin");
setPropsIntText(jTextAutoMarginLimitH, props, "AutoMarginLimitH");
setPropsIntText(jTextAutoMarginLimitV, props, "AutoMarginLimitV");
setPropsIntText(jTextAutoMarginWhiteLevel, props, "AutoMarginWhiteLevel");
setPropsFloatText(jTextAutoMarginPadding, props, "AutoMarginPadding");
if(props.getProperty("AutoMarginNombre")!=null){ jComboAutoMarginNombre.setSelectedIndex(Integer.parseInt(props.getProperty("AutoMarginNombre"))); }
setPropsFloatText(jTextAutoMarginNombreSize, props, "AutoMarginNombreSize");
////////////////////////////////////////////////////////////////
//詳細設定
propValue = props.getProperty("SpaceHyphenation");
if (propValue != null) {
jRadioSpaceHyp1.setSelected("1".equals(propValue));
jRadioSpaceHyp2.setSelected("2".equals(propValue));
jRadioSpaceHyp0.setSelected("0".equals(propValue));
}
//注記のルビ表示
propValue = props.getProperty("ChukiRuby");
if (propValue != null) {
jRadioChukiRuby0.setSelected("0".equals(propValue));
jRadioChukiRuby1.setSelected("1".equals(propValue));
jRadioChukiRuby2.setSelected("2".equals(propValue));
}
//自動縦中横
//半角2文字縦書き
setPropsSelected(jCheckAutoYoko, props, "AutoYoko");
//半角数字1文字縦書き
setPropsSelected(jCheckAutoYokoNum1, props, "AutoYokoNum1");
//半角数字3文字縦書き
setPropsSelected(jCheckAutoYokoNum3, props, "AutoYokoNum3");
//!? 1文字
setPropsSelected(jCheckAutoEQ1, props, "AutoYokoEQ1");
//コメント出力
setPropsSelected(jCheckCommentPrint, props, "CommentPrint");
setPropsSelected(jCheckCommentConvert, props, "CommentConvert");
//空行除去
if(props.getProperty("RemoveEmptyLine")!=null){ jComboxRemoveEmptyLine.setSelectedIndex(Integer.parseInt(props.getProperty("RemoveEmptyLine"))); }
propValue = props.getProperty("MaxEmptyLine");
if(propValue!=null){jComboxMaxEmptyLine.setSelectedIndex(Integer.parseInt(propValue)); }
//行頭字下げ追加
setPropsSelected(jCheckForceIndent, props, "ForceIndent");
//強制改ページ
setPropsSelected(jCheckPageBreak, props, "PageBreak");
if(props.getProperty("PageBreakSize")!=null){ jTextPageBreakSize.setText(Integer.toString(Integer.parseInt(props.getProperty("PageBreakSize")))); }
setPropsSelected(jCheckPageBreakEmpty, props, "PageBreakEmpty");
propValue = props.getProperty("PageBreakEmptyLine");
if (propValue != null) jComboxPageBreakEmptyLine.setSelectedItem(propValue);
setPropsIntText(jTextPageBreakEmptySize, props, "PageBreakEmptySize");
setPropsSelected(jCheckPageBreakChapter, props, "PageBreakChapter");
setPropsIntText(jTextPageBreakChapterSize, props, "PageBreakChapterSize");
////////////////////////////////////////////////////////////////
//目次設定
//最大文字数
setPropsIntText(jTextMaxChapterNameLength, props, "MaxChapterNameLength");
//表紙
setPropsSelected(jCheckCoverPageToc, props, "CoverPageToc");
setPropsSelected(jCheckTitleToc, props, "TitleToc");
setPropsSelected(jCheckChapterUseNextLine, props, "ChapterUseNextLine");
setPropsSelected(jCheckChapterExclude, props, "ChapterExclude");
//目次階層化
setPropsSelected(jCheckNavNest, props, "NavNest");
setPropsSelected(jCheckNcxNest, props, "NcxNest");
//改ページ後を目次に追加
setPropsSelected(jCheckChapterSection, props, "ChapterSection");
//見出し注記
setPropsSelected(jCheckChapterH, props, "ChapterH");
setPropsSelected(jCheckChapterH1, props, "ChapterH1");
setPropsSelected(jCheckChapterH2, props, "ChapterH2");
setPropsSelected(jCheckChapterH3, props, "ChapterH3");
setPropsSelected(jCheckSameLineChapter, props, "SameLineChapter");
//章番号、数字、パターン
setPropsSelected(jCheckChapterName, props, "ChapterName");
setPropsSelected(jCheckChapterNumOnly, props, "ChapterNumOnly");
setPropsSelected(jCheckChapterNumTitle, props, "ChapterNumTitle");
setPropsSelected(jCheckChapterNumParen, props, "ChapterNumParen");
setPropsSelected(jCheckChapterNumParenTitle, props, "ChapterNumParenTitle");
setPropsSelected(jCheckChapterPattern, props, "ChapterPattern");
if (props.containsKey("ChapterPatternText")) jComboChapterPattern.setSelectedItem(props.getProperty("ChapterPatternText"));
////////////////////////////////////////////////////////////////
//スタイル
propValue = props.getProperty("PageMargin");
if (propValue != null) {
String[] pageMargins = propValue.split(",");
for (int i=0; i<pageMargins.length; i++) jTextPageMargins[i].setText(pageMargins[i]);
}
propValue = props.getProperty("PageMarginUnit");
if (propValue != null) {
jRadioPageMarginUnit0.setSelected("0".equals(propValue));
jRadioPageMarginUnit1.setSelected("1".equals(propValue));
//jRadioPageMarginUnit2.setSelected("2".equals(propValue));
}
propValue = props.getProperty("BodyMargin");
if (propValue != null) {
String[] bodyMargins = propValue.split(",");
for (int i=0; i<bodyMargins.length; i++) jTextBodyMargins[i].setText(bodyMargins[i]);
}
propValue = props.getProperty("BodyMarginUnit");
if (propValue != null) {
jRadioBodyMarginUnit0.setSelected("0".equals(propValue));
jRadioBodyMarginUnit1.setSelected("1".equals(propValue));
//jRadioBodyMarginUnit2.setSelected("2".equals(propValue));
}
propValue = props.getProperty("LineHeight");
if (propValue != null && !propValue.isEmpty()) jComboLineHeight.setSelectedItem(propValue);
propValue = props.getProperty("FontSize");
if (propValue != null && !propValue.isEmpty()) jComboFontSize.setSelectedItem(propValue);
setPropsSelected(jCheckBoldUseGothic, props, "BoldUseGothic");
setPropsSelected(jCheckGothicUseBold, props, "GothicUseBold");
//文字
propValue = props.getProperty("DakutenType");
if (propValue != null) {
jRadioDakutenType0.setSelected("0".equals(propValue));
jRadioDakutenType1.setSelected("1".equals(propValue));
jRadioDakutenType2.setSelected("2".equals(propValue));
}
setPropsSelected(jCheckIvsBMP, props, "IvsBMP");
setPropsSelected(jCheckIvsSSP, props, "IvsSSP");
////////////////////////////////////////////////////////////////
//Web
setPropsFloatText(jTextWebInterval, props, "WebInterval");
if (props.getProperty("UserAgent") != null && !props.getProperty("UserAgent").isEmpty())
jComboUa.setSelectedItem(props.getProperty("UserAgent"));
setPropsSelected(jCheckWebLageImage, props, "jCheckWebLageImage");
setPropsText(jTextCachePath, props, "CachePath");
if ("".equals(jTextCachePath.getText())) jTextCachePath.setText(".cache");
setPropsNumberText(jTextWebModifiedExpire, props, "WebModifiedExpire");
setPropsSelected(jCheckWebConvertUpdated, props, "WebConvertUpdated");
setPropsSelected(jCheckWebModifiedOnly, props, "WebModifiedOnly");
setPropsSelected(jCheckWebModifiedTail, props, "WebModifiedTail");
setPropsSelected(jCheckWebBeforeChapter, props, "WebBeforeChapter");
setPropsIntText(jTextWebBeforeChapterCount, props, "WebBeforeChapterCount");
}
ChatGPT:
AndroidのSharedPreferencesを使って、指定されたPropertiesの値を保存するように書き換えました。
変更点:
- SharedPreferencesを使用して設定を保存。
- apply()を使って非同期で保存。
- UIコンポーネントの代わりに、SharedPreferencesのキーを使用。
SharedPreferencesを使用して設定を保存。
apply()を使って非同期で保存。
UIコンポーネントの代わりに、SharedPreferencesのキーを使用。
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Properties;
public class PreferenceManager {
private static final String PREF_NAME = "AppPreferences";
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
public PreferenceManager(Context context) {
this.sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
this.editor = sharedPreferences.edit();
}
public void loadProperties(Properties props) {
if (props == null) return;
// タイトルタイプ
if (props.getProperty("TitleType") != null) {
editor.putInt("TitleType", Integer.parseInt(props.getProperty("TitleType")));
}
editor.putBoolean("PubFirst", Boolean.parseBoolean(props.getProperty("PubFirst", "false")));
editor.putBoolean("UseFileName", Boolean.parseBoolean(props.getProperty("UseFileName", "false")));
// 表紙
editor.putString("Cover", props.getProperty("Cover", ""));
editor.putBoolean("CoverHistory", Boolean.parseBoolean(props.getProperty("CoverHistory", "false")));
editor.putInt("MaxCoverLine", parseInt(props.getProperty("MaxCoverLine")));
// ページ設定
editor.putBoolean("CoverPage", Boolean.parseBoolean(props.getProperty("CoverPage", "false")));
editor.putBoolean("TitlePageWrite", Boolean.parseBoolean(props.getProperty("TitlePageWrite", "false")));
editor.putString("TitlePage", props.getProperty("TitlePage", ""));
editor.putBoolean("TocPage", Boolean.parseBoolean(props.getProperty("TocPage", "false")));
editor.putBoolean("TocVertical", Boolean.parseBoolean(props.getProperty("TocVertical", "false")));
// 出力ファイル設定
editor.putString("Ext", props.getProperty("Ext", ""));
editor.putBoolean("AutoFileName", Boolean.parseBoolean(props.getProperty("AutoFileName", "false")));
editor.putBoolean("OverWrite", Boolean.parseBoolean(props.getProperty("OverWrite", "false")));
editor.putBoolean("MarkId", Boolean.parseBoolean(props.getProperty("MarkId", "false")));
// 縦書き横書き
editor.putBoolean("Vertical", Boolean.parseBoolean(props.getProperty("Vertical", "false")));
// 文字コード
if (props.getProperty("EncType") != null) {
editor.putInt("EncType", Integer.parseInt(props.getProperty("EncType")));
}
// 言語設定
editor.putString("LangType", props.getProperty("LangType", ""));
// 画像設定
editor.putBoolean("NoIllust", Boolean.parseBoolean(props.getProperty("NoIllust", "false")));
editor.putInt("DispW", parseInt(props.getProperty("DispW")));
editor.putInt("DispH", parseInt(props.getProperty("DispH")));
// Jpeg圧縮率
editor.putInt("JpegQuality", parseInt(props.getProperty("JpegQuality")));
// 詳細設定
editor.putBoolean("AutoYoko", Boolean.parseBoolean(props.getProperty("AutoYoko", "false")));
editor.putBoolean("CommentPrint", Boolean.parseBoolean(props.getProperty("CommentPrint", "false")));
// Web設定
editor.putFloat("WebInterval", parseFloat(props.getProperty("WebInterval")));
editor.putString("UserAgent", props.getProperty("UserAgent", ""));
editor.putString("CachePath", props.getProperty("CachePath", ".cache"));
editor.putBoolean("WebConvertUpdated", Boolean.parseBoolean(props.getProperty("WebConvertUpdated", "false")));
// 変更を保存
editor.apply();
}
private int parseInt(String value) {
try {
return value != null ? Integer.parseInt(value) : 0;
} catch (NumberFormatException e) {
return 0;
}
}
private float parseFloat(String value) {
try {
return value != null ? Float.parseFloat(value) : 0.0f;
} catch (NumberFormatException e) {
return 0.0f;
}
}
}
ポイント
- SharedPreferencesを使い、アプリの設定を永続化。
- parseIntとparseFloatで例外処理を行い、安全に変換。
- apply()を使い非同期で保存(パフォーマンス向上)。
SharedPreferencesを使い、アプリの設定を永続化。
parseIntとparseFloatで例外処理を行い、安全に変換。
apply()を使い非同期で保存(パフォーマンス向上)。
このコードをアクティビティで使う場合は、以下のように呼び出せます:
PreferenceManager preferenceManager = new PreferenceManager(context); preferenceManager.loadProperties(properties);
何かカスタマイズが必要なら教えてください!
あなた:
uiも書いて
ChatGPT:
AndroidでUIも含めてPreferenceManagerを利用できるように、設定画面(Preferences Screen)を作成しました。
構成:
- 設定のデータ管理 (PreferenceManager)
- 設定画面 (SettingsActivity & SettingsFragment)
- 設定画面のレイアウト (res/xml/preferences.xml)
設定のデータ管理 (PreferenceManager)
設定画面 (SettingsActivity & SettingsFragment)
設定画面のレイアウト (res/xml/preferences.xml)
SharedPreferencesを使って、プロパティを保存・読み込みします。
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.preference.PreferenceManager;
import java.util.Properties;
public class AppPreferenceManager {
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
public AppPreferenceManager(Context context) {
this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
this.editor = sharedPreferences.edit();
}
public void loadProperties(Properties props) {
if (props == null) return;
try {
editor.putInt("TitleType", parseInt(props.getProperty("TitleType")));
editor.putBoolean("PubFirst", Boolean.parseBoolean(props.getProperty("PubFirst", "false")));
editor.putBoolean("UseFileName", Boolean.parseBoolean(props.getProperty("UseFileName", "false")));
editor.putString("Cover", props.getProperty("Cover", ""));
editor.putBoolean("CoverHistory", Boolean.parseBoolean(props.getProperty("CoverHistory", "false")));
editor.putInt("MaxCoverLine", parseInt(props.getProperty("MaxCoverLine")));
editor.putBoolean("CoverPage", Boolean.parseBoolean(props.getProperty("CoverPage", "false")));
editor.putBoolean("TitlePageWrite", Boolean.parseBoolean(props.getProperty("TitlePageWrite", "false")));
editor.putBoolean("TocPage", Boolean.parseBoolean(props.getProperty("TocPage", "false")));
editor.putBoolean("TocVertical", Boolean.parseBoolean(props.getProperty("TocVertical", "false")));
editor.putString("Ext", props.getProperty("Ext", ""));
editor.putBoolean("AutoFileName", Boolean.parseBoolean(props.getProperty("AutoFileName", "false")));
editor.putBoolean("OverWrite", Boolean.parseBoolean(props.getProperty("OverWrite", "false")));
editor.putBoolean("MarkId", Boolean.parseBoolean(props.getProperty("MarkId", "false")));
editor.putBoolean("Vertical", Boolean.parseBoolean(props.getProperty("Vertical", "false")));
editor.putString("LangType", props.getProperty("LangType", ""));
editor.putInt("JpegQuality", parseInt(props.getProperty("JpegQuality")));
editor.putFloat("WebInterval", parseFloat(props.getProperty("WebInterval")));
editor.putString("UserAgent", props.getProperty("UserAgent", ""));
editor.putString("CachePath", props.getProperty("CachePath", ".cache"));
editor.apply();
} catch (Exception e) {
Log.e("AppPreferenceManager", "Error saving preferences", e);
}
}
private int parseInt(String value) {
try {
return value != null ? Integer.parseInt(value) : 0;
} catch (NumberFormatException e) {
return 0;
}
}
private float parseFloat(String value) {
try {
return value != null ? Float.parseFloat(value) : 0.0f;
} catch (NumberFormatException e) {
return 0.0f;
}
}
}
設定を表示・編集するための画面を作成します。
設定画面を開くアクティビティ。
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings_container, new SettingsFragment())
.commit();
}
}
設定の UI を管理する PreferenceFragmentCompat。
import android.os.Bundle;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
}
}
ユーザーが変更できる設定の UI を作成。
res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<ListPreference
app:key="TitleType"
app:title="タイトルタイプ"
app:dialogTitle="タイトルタイプを選択"
app:entries="@array/title_types"
app:entryValues="@array/title_type_values"
app:defaultValue="0" />
<SwitchPreferenceCompat
app:key="PubFirst"
app:title="PubFirst"
app:defaultValue="false" />
<SwitchPreferenceCompat
app:key="UseFileName"
app:title="ファイル名を使用"
app:defaultValue="false" />
<EditTextPreference
app:key="Cover"
app:title="表紙"
app:dialogTitle="表紙のパスを入力"
app:defaultValue="" />
<SwitchPreferenceCompat
app:key="CoverHistory"
app:title="表紙履歴を有効化"
app:defaultValue="false" />
<SeekBarPreference
app:key="JpegQuality"
app:title="JPEG品質"
app:min="0"
app:max="100"
app:defaultValue="75" />
<EditTextPreference
app:key="WebInterval"
app:title="Web更新間隔(秒)"
app:inputType="numberDecimal"
app:defaultValue="60" />
<EditTextPreference
app:key="UserAgent"
app:title="User-Agent"
app:dialogTitle="User-Agent を入力"
app:defaultValue="" />
<SwitchPreferenceCompat
app:key="WebConvertUpdated"
app:title="Webの更新を変換"
app:defaultValue="false" />
</PreferenceScreen>
res/values/arrays.xml に選択肢を定義。
<resources>
<string-array name="title_types">
<item>なし</item>
<item>小</item>
<item>中</item>
<item>大</item>
</string-array>
<string-array name="title_type_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
</resources>
設定画面を開くために、MainActivity などから SettingsActivity を起動します。
Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent);
✅ SharedPreferences を使用してプロパティを保存 ✅ SettingsActivity で設定画面を表示 ✅ PreferenceFragmentCompat を使用して UI を作成 ✅ スイッチ、リスト、テキスト入力、シークバーを活用
これで、アプリの設定を Android の SharedPreferences に保存し、UI から変更できるようになります。 追加機能やカスタマイズが必要なら教えてください! 🚀