Android通过代码实现多语言切换、createConfigurationContext、attachBaseContext、getResources、updateConfiguration

updateConfiguration 过时兼容处理

@Override
public Resources getResources() {//此方法会 多次 调用
    Configuration configuration = new Configuration();
    configuration.smallestScreenWidthDp = 900;
    //updateConfiguration 过时兼容处理
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        return createConfigurationContext(configuration).getResources();
    } else {
        Resources resources = super.getResources();
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        return resources;
    }
}

自定义view时获取指定带configuration的context

private Context getSplitScreenContext() {
    Configuration newConfig = new Configuration();
    newConfig.setToDefaults();
    newConfig.smallestScreenWidthDp = MyApplication.mSmallestScreenWidthDp;
    Context context = mContext.createConfigurationContext(newConfig);
    return new ContextWrapper(context);
}

//
LayoutInflater.from(getSplitScreenContext())

参考

Android通过代码实现多语言切换

Android动态设置APP语言

测试demo 1: 重写 attachBaseContext

public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        int smallestScreenWidthDp1 = getApplicationContext().getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application onCreate: 1=========" + smallestScreenWidthDp1);//600
        int smallestScreenWidthDp2 = getBaseContext().getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application onCreate: 2=========" + smallestScreenWidthDp2);//600
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        int smallestScreenWidthDp = newBase.getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application attachBaseContext: 1=========" + smallestScreenWidthDp);//720
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 600;
        super.attachBaseContext(newBase.createConfigurationContext(configuration));
        Log.e(TAG, "Application attachBaseContext: 2=========" + smallestScreenWidthDp);//720
    }
}
public class MainActivity8 extends AppCompatActivity {
    private static final String TAG = MainActivity8.class.getSimpleName();
  
    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main8);

        Context baseContext = getBaseContext();
        Context applicationContext = getApplicationContext();
        {
            Log.e(TAG, "this: ========" + this);//【803afaa】
            Log.e(TAG, "getBaseContext(): ========" + baseContext);//【93c79b】
            //getApplication 和 getApplicationContext 一样地址
            Log.e(TAG, "getApplication(): ========" + getApplication()); //【@29f6738】
            Log.e(TAG, "getApplicationContext(): ========" + applicationContext);//【29f6738】
        }

        {
            // getResources() 和 getBaseContext().getResources() 在 activity 中同一个对象【ca23311】
            // getApplicationContext().getResources() 为另一个对象 【cc51c76】
            Log.e(TAG, "getResources(): 1=======" + getResources());//【ca23311】
            Log.e(TAG, "getResources(): 2========" + baseContext.getResources());//【ca23311】
            Log.e(TAG, "getResources(): 3========" + applicationContext.getResources());//【cc51c76】

            //activity 中 attachBaseContext 仅仅会影响以下2个:
            int smallestScreenWidthDp1 = getResources().getConfiguration().smallestScreenWidthDp;
            Log.e(TAG, "smallestScreenWidthDp: 1========" + smallestScreenWidthDp1);//900
            int smallestScreenWidthDp2 = baseContext.getResources().getConfiguration().smallestScreenWidthDp;
            Log.e(TAG, "smallestScreenWidthDp: 2========" + smallestScreenWidthDp2);//900

            //application 中 attachBaseContext 仅仅会影响以下:
            int smallestScreenWidthDp3 = applicationContext.getResources().getConfiguration().smallestScreenWidthDp;
            Log.e(TAG, "smallestScreenWidthDp: 3========" + smallestScreenWidthDp3);//600
        }
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        int smallestScreenWidthDp = newBase.getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "activity attachBaseContext: 1=========" + smallestScreenWidthDp);//720
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 900;
        super.attachBaseContext(newBase.createConfigurationContext(configuration));
        Log.e(TAG, "activity attachBaseContext: 2=========" + smallestScreenWidthDp);//720
    }
}
日志打印:
MyApplication: Application attachBaseContext: 1=========720
MyApplication: Application attachBaseContext: 2=========720
MyApplication: Application onCreate: 1=========600
MyApplication: Application onCreate: 2=========600

MainActivity8: activity attachBaseContext: 1=========720
MainActivity8: activity attachBaseContext: 2=========720
MainActivity8: this: ========com.xq.myapplication.MainActivity8@6070295
MainActivity8: getBaseContext(): ========androidx.appcompat.view.ContextThemeWrapper@22f444e
MainActivity8: getApplication(): ========com.xq.myapplication.MyApplication@744096f
MainActivity8: getApplicationContext(): ========com.xq.myapplication.MyApplication@744096f
MainActivity8: getResources(): 1=======android.content.res.Resources@db2067c
MainActivity8: getResources(): 2========android.content.res.Resources@db2067c
MainActivity8: getResources(): 3========android.content.res.Resources@2aebb05
MainActivity8: smallestScreenWidthDp: 1========900
MainActivity8: smallestScreenWidthDp: 2========900
MainActivity8: smallestScreenWidthDp: 3========600

测试demo 2: 重写 attachBaseContext 和 getResources

  • 重写 attachBaseContext 和 重写 getResources 都可以改变 configuration
  • 生命周期 attachBaseContext -> getResources -> onCreate : 所以getResources会覆盖attachBaseContext
public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        int smallestScreenWidthDp1 = getApplicationContext().getResources().getConfiguration().smallestScreenWidthDp;
        //getResources()会覆盖attachBaseContext()
        Log.e(TAG, "Application onCreate: 1=========" + smallestScreenWidthDp1);//300
        int smallestScreenWidthDp2 = getBaseContext().getResources().getConfiguration().smallestScreenWidthDp;
        //getResources()会覆盖attachBaseContext()
        Log.e(TAG, "Application onCreate: 2=========" + smallestScreenWidthDp2);//300
    }

    @Override
    protected void attachBaseContext(Context newBase) {//此方法会 1 次调用
        int smallestScreenWidthDp = newBase.getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application attachBaseContext: 1=========" + smallestScreenWidthDp);//720不会变
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 600;
        super.attachBaseContext(newBase.createConfigurationContext(configuration));
        Log.e(TAG, "Application attachBaseContext: 2=========" + smallestScreenWidthDp);//720不会变
    }

    @Override
    public Resources getResources() {//此方法会 多次 调用
        Resources resources = super.getResources();
        int smallestScreenWidthDp1 = resources.getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application getResources: 1=========" + smallestScreenWidthDp1);
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 300;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        int smallestScreenWidthDp2 = resources.getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "Application getResources: 2=========" + smallestScreenWidthDp2);
        return resources;
    }
}
public class MainActivity8 extends AppCompatActivity implements View.OnTouchListener {
    private static final String TAG = MainActivity8.class.getSimpleName();

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main8);

        Context baseContext = getBaseContext();
        Context applicationContext = getApplicationContext();
        {
            Log.e(TAG, "this: ========" + this);//【803afaa】
            Log.e(TAG, "getBaseContext(): ========" + baseContext);//【93c79b】
            //getApplication 和 getApplicationContext 一样地址
            Log.e(TAG, "getApplication(): ========" + getApplication()); //【@29f6738】
            Log.e(TAG, "getApplicationContext(): ========" + applicationContext);//【29f6738】
        }

        {
            // getResources() 和 getBaseContext().getResources() 在 activity 中同一个对象【ca23311】
            // getApplicationContext().getResources() 为另一个对象 【cc51c76】
            Log.e(TAG, "getResources(): 1=======" + getResources());//【ca23311】
            Log.e(TAG, "getResources(): 2========" + baseContext.getResources());//【ca23311】
            Log.e(TAG, "getResources(): 3========" + applicationContext.getResources());//【cc51c76】

            //activity 中 attachBaseContext 仅仅会影响以下2个:
            int smallestScreenWidthDp1 = getResources().getConfiguration().smallestScreenWidthDp;
            //getResources()会覆盖attachBaseContext()
            Log.e(TAG, "smallestScreenWidthDp: 1========" + smallestScreenWidthDp1);//900
            int smallestScreenWidthDp2 = baseContext.getResources().getConfiguration().smallestScreenWidthDp;
            //getResources()会覆盖attachBaseContext()
            Log.e(TAG, "smallestScreenWidthDp: 2========" + smallestScreenWidthDp2);//900

            //application 中 attachBaseContext 仅仅会影响以下:
            int smallestScreenWidthDp3 = applicationContext.getResources().getConfiguration().smallestScreenWidthDp;
            Log.e(TAG, "smallestScreenWidthDp: 3========" + smallestScreenWidthDp3);//300
        }
    }

    @Override
    protected void attachBaseContext(Context newBase) {//此方法会 1 次调用
        int smallestScreenWidthDp = newBase.getResources().getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "activity attachBaseContext: 1=========" + smallestScreenWidthDp);//720不会变
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 1200;
        super.attachBaseContext(newBase.createConfigurationContext(configuration));
        Log.e(TAG, "activity attachBaseContext: 2=========" + smallestScreenWidthDp);//720不会变
    }

    @Override
    public Resources getResources() {//此方法会 多次 调用
        Resources resources = super.getResources();
        int smallestScreenWidthDp1 = resources.getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "activity getResources: 1=========" + smallestScreenWidthDp1);
        Configuration configuration = new Configuration();
        configuration.smallestScreenWidthDp = 900;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        int smallestScreenWidthDp2 = resources.getConfiguration().smallestScreenWidthDp;
        Log.e(TAG, "activity getResources: 2=========" + smallestScreenWidthDp2);
        return resources;
    }
}
打印
MyApplication: Application attachBaseContext: 1=========720
MyApplication: Application attachBaseContext: 2=========720
MyApplication: Application getResources: 1=========600
MyApplication: Application getResources: 2=========300
MyApplication: Application onCreate: 1=========300
MyApplication: Application onCreate: 2=========300

MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: activity attachBaseContext: 1=========720
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: activity attachBaseContext: 2=========720
MainActivity8: activity getResources: 1=========1200
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: this: ========com.xq.myapplication.MainActivity8@6070295
MainActivity8: getBaseContext(): ========androidx.appcompat.view.ContextThemeWrapper@744096f
MainActivity8: getApplication(): ========com.xq.myapplication.MyApplication@db2067c
MainActivity8: getApplicationContext(): ========com.xq.myapplication.MyApplication@db2067c
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: getResources(): 1=======android.content.res.Resources@2aebb05
MainActivity8: getResources(): 2========android.content.res.Resources@2aebb05
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: getResources(): 3========android.content.res.Resources@c3f575a
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: smallestScreenWidthDp: 1========900
MainActivity8: smallestScreenWidthDp: 2========900
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: smallestScreenWidthDp: 3========300
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MyApplication: Application getResources: 1=========300
MyApplication: Application getResources: 2=========300
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
MainActivity8: activity getResources: 1=========900
MainActivity8: activity getResources: 2=========900
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要在代码切换 Android 设备的语言并重启应用程序,可以使用以下代码: ``` // 获取系统配置对象 Configuration config = getResources().getConfiguration(); // 设置新的语言 config.locale = new Locale("en"); // 更新配置 getResources().updateConfiguration(config, getResources().getDisplayMetrics()); // 重启应用程序 Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); ``` 注意,需要自己实现MainActivity.class,更改"en"为需要切换语言 ### 回答2: Android切换语言重启的代码可以通过修改系统配置并重新启动Activity来实现。具体步骤如下: 1. 首先,需要创建一个共享参数(SharedPreferences)来保存所选的语言设置。在Activity中定义一个SharedPreferences对象,用于存储和读取语言设置。例如: ``` SharedPreferences preferences = getSharedPreferences("LanguagePrefs", MODE_PRIVATE); ``` 2. 在需要切换语言的地方,首先获取到用户所选择的新语言。假设语言选择是通过点击按钮来实现的,使用一个String变量`newLanguage`保存新语言的值。例如: ``` String newLanguage = "en"; // 假设新使用英文(en)作为语言 ``` 3. 在切换语言之前,将新语言的值保存到共享参数中,以便在重启Activity后继续使用。使用SharedPreferences编辑器(Editor)添加或修改语言设置。例如: ``` SharedPreferences.Editor editor = preferences.edit(); editor.putString("language", newLanguage); editor.apply(); ``` 4. 重新启动Activity。通过调用当前Activity的`recreate()`方法,强制重启当前Activity,以便应用切换到新的语言。例如: ``` recreate(); ``` 5. 在Activity的`onCreate()`方法中,读取保存的语言设置并应用到应用程序的配置中。通过读取共享参数中保存的语言设置,然后调用`ContextWrapper`类的`attachBaseContext()`方法传入新的配置。例如: ``` @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 读取共享参数中保存的语言设置 String language = preferences.getString("language", ""); // 根据新语言设置重新配置应用 Context context = ChangeLanguageActivity.this; LocaleUtils.setLocale(context, language); // 自定义工具类设置应用语言 // ... } ``` 6. 最后,重新定义一个自定义工具类`LocaleUtils`,用于应用程序级别的语言设置。例如: ``` public class LocaleUtils { public static void setLocale(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale); Resources resources = context.getResources(); Configuration configuration = resources.getConfiguration(); configuration.setLocale(locale); configuration.setLayoutDirection(locale); resources.updateConfiguration(configuration, resources.getDisplayMetrics()); } } ``` 通过以上步骤,当用户切换语言后,会重新启动当前Activity并应用新语言的配置。请注意,重启Activity可能会造成界面闪烁,所以可以添加一些过渡动画来提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值