2

インターネットから文字列を更新できるようにしたい。更新された文字列のリストをハッシュ マップにダウンロードし、各文字列が ID (R.string.) にマップされているとします。string.xml を変更できると思っていましたが、岩の上に書かれていると思います。

ビューの文字列を置き換えて、インフレート中に更新されたリストを使用するにはどうすればよいですか? 現在、私は2つのことを試しました。

最初に、getString を変更したカスタム リソース オブジェクトを返すアクティビティ用のカスタム getResources を作成しました。ただし、おそらくアクティビティ インフレータは getResources() を使用しないため、何も変わりません。

その後、ボタンなどの setText メソッドをオーバーライドできると考えましたが、いくつかの理由で最終的なものです。

他の提案はありますか?このプロセスを自動化したいのですが、そうしないと非常に難しくなります。(どのビューがどのIDを使用しているかを見つけることさえできますか?リソースxmlを解析できるかもしれません)

全てに感謝

4

1 に答える 1

1

データベースまたは sharedPreferences を使用して文字列の値を保持し、デフォルトの R.string.bla_bla として使用します。これにより、リソースを変更する方法がなく、アプリ全体を更新することができなくなります。文字列を読み取るには、次のようなものを試してください。

SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences( context );
String bla_bla = mSharedPreferences.getString( "R.string.bla_bla", context.getString( R.string.bla_bla ));

そして値を置き換えるには:

Editor editor = PreferenceManager.getDefaultSharedPreferences( context ).edit();
editor.putString( "R.string.bla_bla", bla_bla );
editor.commit();

更新しました

はい、分かりました。次に、このような独自のクラス extends を作成する必要がありますButton

public class MButton extends Button {
    String mText;
    public MButton( Context context, AttributeSet attrs ) {
        super( context, attrs );
        loadText( context, attrs );
    }
    public MButton( Context context, AttributeSet attrs, int defStyle ) {
        super( context, attrs, defStyle );
        loadText( context, attrs );
    }
    void loadText( Context context, AttributeSet attrs ) {
        String stringId = attrs.getAttributeValue( "http://schemas.android.com/apk/res/android", "text" );
        // stringId = @2130903040
        int intStringId = Integer.parseInt( stringId.substring( 1 ));
        // intStringId = 2130903040
        mText = PreferenceManager.getDefaultSharedPreferences( context ).getString( stringId, context.getString( intStringId ));
    }
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        setText( mText );
    }
}

そして、あなたのレイアウトでそれを使用してください:

<com.example.test.MButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:onClick="clicked" />

ただし、すべての SharedPreferences をクリーンアップしてカスタム文字列を保持していることを確認してください。アプリを更新すると、リソース ID が並べ替えられます。幸運を!

于 2013-10-05T10:31:38.103 に答える