2

我希望能够从互联网更新字符串。假设我在哈希映射中下载了更新字符串的列表,每个字符串都映射到它们的 ID(R.string。)。我以为我可以修改 string.xml 但我猜它们是写在岩石上的。

如何在膨胀事物时替换视图的字符串并使用更新的列表?目前我尝试了两件事。

首先,我为我的活动创建了一个自定义 getResources,它返回一个带有修改后的 getString 的自定义资源对象。但是,可能活动充气机不使用 getResources() 所以没有任何变化。

之后,我认为我可以覆盖按钮等的 setText 方法,但是由于某些原因它们是最终的。

还有其他建议吗?我想自动化这个过程,否则会很困难。(我什至可以找到哪些视图使用哪些 id?也许我可以解析资源 xmls)

谢谢大家

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 回答