【问题标题】:Android how to Check if language has changedAndroid如何检查语言是否已更改
【发布时间】:2020-01-03 11:33:18
【问题描述】:

我创建了一个带有MVVM 概念的应用程序,在我的Activity 中有viewpagerfragment。当我在应用程序中更改语言时,一些数据发生了变化,但 web 服务显示的数据没有变化。所以我尝试在我的每个Activity 中添加android:configChanges="locale",并且我已经在我的Activity 类中添加了此代码:

  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
       recreate();
    }
}

但它使我的 UI 重新创建每个配置更改,包括 Screen Rotation,而我只想在更改语言时重新创建。

这是我的片段代码:

public class CatalogueFragment extends BaseFragment<FragmentCatalogueBinding, CatalogueViewModel>
    implements CatalogueNavigator, CatalogueAdapter.CatalogueAdapterListener {

@Inject
CatalogueAdapter adapter;

@Inject
LinearLayoutManager mLayoutManager;

@Inject
ViewModelProvider.Factory factory;

FragmentCatalogueBinding fragmentCatalogueBinding;

private CatalogueViewModel catalogueViewModel;

public static CatalogueFragment newInstance(int Pos) {
    Bundle args = new Bundle();
    CatalogueFragment fragment = new CatalogueFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public int getBindingVariable() {
    return BR.viewModel;
}

@Override
public int getLayoutId() {
    return R.layout.fragment_catalogue;
}

@Override
public CatalogueViewModel getViewModel() {
    catalogueViewModel = ViewModelProviders.of(this, factory).get(CatalogueViewModel.class);
    return catalogueViewModel;
}

@Override
public void handleError(String error) {
    // handle error
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    catalogueViewModel.setNavigator(this);
    adapter.setListener(this);
}

@Override
public void onRetryClick() {
    catalogueViewModel.fetchData();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    fragmentCatalogueBinding = getViewDataBinding();
    setUp();
}

@Override
public void updateData(List<Movie> movieList) {
    adapter.addItems(movieList);
}

private void setUp() {
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    fragmentCatalogueBinding.recyclerCatalogue.setLayoutManager(mLayoutManager);
    fragmentCatalogueBinding.recyclerCatalogue.setItemAnimator(new DefaultItemAnimator());
    fragmentCatalogueBinding.recyclerCatalogue.setAdapter(adapter);
}
}

这是我的ViewModel 课程

 public class CatalogueViewModel extends BaseViewModel {

    private final MutableLiveData<List<Movie>> movieListLiveData;

    public CatalogueViewModel(DataManager dataManager, SchedulerProvider schedulerProvider) {
        super(dataManager, schedulerProvider);
        movieListLiveData = new MutableLiveData<>();
        fetchData();
    }

    public void fetchData() {
        setIsLoading(true);
        getCompositeDisposable().add(getDataManager()
                .getApiHelper().doMovieCall(URLConfig.API_KEY, getDataManager().getLanguage())
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribe(movieResponse -> {
                    if (movieResponse != null && movieResponse.getResults() != null) {
                        movieListLiveData.setValue(movieResponse.getResults());
                    }
                    setIsLoading(false);
                }, throwable -> {
                    setIsLoading(false);
//                    getNavigator().handleError(throwable);
                }));
    }

    public LiveData<List<Movie>> getMovieListLiveData() {
        return movieListLiveData;
    }
}

谁能告诉我我哪里错了?非常感谢

【问题讨论】:

    标签: java android mvvm configuration android-mvvm


    【解决方案1】:

    您可以使用:ACTION_LOCALE_CHANGED

    这里是一个例子:

    private BroadcastReceiver mLangReceiver = null;
    
    protected BroadcastReceiver setupLangReceiver(){
    
        if(mLangReceiver == null) {
    
            mLangReceiver = new BroadcastReceiver() {
    
                @Override
                public void onReceive(Context context, Intent intent) {
                    // do what you want
                }
    
            };
    
            registerReceiver(mLangReceiver, new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
        }
    
        return mLangReceiver;
    }
    

    【讨论】:

    • 抱歉回复晚了..非常感谢您的解决方案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多