【问题标题】:While using same spinner in all the activities在所有活动中使用相同的微调器
【发布时间】:2014-02-25 19:27:14
【问题描述】:

我对我的应用程序中的所有活动都使用相同的微调器。假设微调器中的项目是英语,芬兰语,波兰语,等等。当我在一项活动中选择芬兰语时,微调器的下拉菜单会关闭,并且可以在微调器上看到芬兰语。但是当我进入下一个活动时,它不再显示芬兰语,而是在顶部显示英语(项目)。是否有任何方法可以使已选择所有活动的微调器上的项目出现。或者,除非未更改,否则不应更改。 在 BaseActivity 中;

int currentLanguage = spinner.getSelectedItemPosition();
SharedMemory.getInstance().setCurrentPosition(currentLanguage);

Log.i("SET POSITION", Integer.toString(currentLanguage));

在其他activity中保存item位置的状态;

int position = SharedMemory.getInstance().getCurrentPosition();
    Base_Activity.spinner.setSelection(position);
    Log.i("GET POSITION", Integer.toString(position));

我设法将所选语言设置为 Singleton 类的 SharedMemory。 但是我怎样才能在所有活动中仍然获得相同的 currentLanguage。当我更改活动时,我无法获得它。 注意:此微调器位于 Base_Activity 类的操作栏中,所有其他活动都扩展了此类。 谢谢。

【问题讨论】:

  • 尝试将选择存储在 sharedpreferences 中,当您访问 onResume 中的其他活动时,从共享首选项中获取值并相应地设置微调器位置。
  • @Rat-a-tat-a-tatRatatouille 我正在使用单例类。它与共享偏好不同吗?我不喜欢在项目结束时更改它。
  • SharedMemory.getInstance().getCurrentLanguage();你的意思是说这不会返回正确的值?您是否首先尝试在其他活动中调用它?
  • setCurrentLanguage 应该是静态的,以便您获取最近更新的值
  • 在 BaseActivity 中,我将微调器的选定项设置为 currentLanguage 并存储在 Singleton 类中。当我打开应用程序时,它显示主要活动,对吗?当我在那里选择一项时,那会是什么?它应该设置或获取 CurrentLanguage。由于 Base Activity,我的应用程序的所有活动都可以访问微调器

标签: android android-spinner


【解决方案1】:

最后,我设法解决了我的问题。在我尝试在 spinner.setOnItemSelectedListener() 方法中做一些事情之前,这确实是错误的。 在我的 BaseActivity 中;

Configuration conf = getResources().getConfiguration();

    //creating the position of the language in spinner from arraylist 
    int currentLanguage = Arrays.asList(language_codes).indexOf(
            conf.locale.getLanguage());

    spinner.setSelection(currentLanguage);

这让我选择的微调器项目在我更改活动时始终保持在顶部。希望这可能对其他人有所帮助。 :)

【讨论】:

    【解决方案2】:

    这是因为另一个活动中的微调器与第一个活动中的不同。

    您必须将微调器的当前选择作为参数传递给第二个活动,并将其他微调器选择设置到该位置。

    在 BaseActivity 中:

        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("pos", spinner.getSelectedItemPosition());
        startActivity(intent);
    

    在第二个活动中:

        spinner.setSelection(getIntent().getIntExtra("pos", 0));
    

    【讨论】:

    • 微调器在 BaseActivity 类中的操作栏中。
    • 这个答案没用。因为我不想在项目点击时开始活动。我正在改变语言。我正在尝试访问以更改任何活动的语言。
    • 这不需要在项目点击时完成。无论何时何地你要开始活动,只需像上面的代码一样传递当前微调器的选择。
    • 我明白你的意思。但正如我告诉你的,微调器位于 BaseActivity 类的操作栏中。因此,所有其他活动都通过这个类进行了扩展。这里我不需要刻意。选择项目后,它会使用所选语言刷新当前活动。
    • 好的。我希望我现在得到你。由于无法预测活动何时被销毁,因此最好不要依赖父活动中的微调器对象。一个建议是将微调器位置保存在共享首选项中,以便它始终可用于其他活动。
    【解决方案3】:

    单例类应该是这样的:

    public class SharedMemory {
        public static SharedMemory sharedMem = new SharedMemory();
        private String valueSelected; // or position here
    
        public SharedMemory getInstance() {
            return sharedMem;
        }
    
        public String getCurrentLanguage() {
            Log.i("tag","valueSelected: " + valueSelected);
            return valueSelected;
        }
    
        public void setCurrentLanguage(String currLang) {
            valueSelected = currLang;
            Log.i("tag","valueSelected: " + valueSelected);
        }
    }
    

    编辑:

    onItemSelectedListener(...) {
        if(ShareMemory.getInstance().getCurrentLanguage().equalsIgnoreCase("0")) {
              // then set the value to 0
        }else {
           // set the value still but then set the gui also
        }
    }
    

    // 在 onResume 或 onCreate 方法中 写下:

    spinner.setSelection(ShareMemory.getInstance().getCurrentLanguage());
    

    使用 Log 打印 singleTon 类中的值,以及微调器的 onItemSelected 侦听器。

    【讨论】:

    • 设置正确的值[valueSelected: English or sthng]。但是现在如何在其他活动中获得它呢?当我使用 SharedMemory.getinstance.getCurrentLanguage() 时,它给出了正确的值,但不在微调器中。在微调器中,我无法引用 valueSelected。
    • 存储选中项的位置,当新的activity启动时,使用单例的get方法,你会得到位置,在activity的onResume或者onCreate方法中,设置位置微调器为,spinner.setSelection(你得到的值);
    • “你得到的值”应该是一个整数,因此是位置,所以存储所选项目的位置。
    • 我看到并获得了正确的价值,但是当我进入下一个活动时,它仍然强制将位置的项目设置为顶部。 :(
    • 创建活动并设置微调器时,您必须在 OnItemSelected 侦听器中设置微调器的位置,检查该值是否不同于 2,如果是,请将其设置为价值。检查编辑以获得清晰的想法
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2019-09-19
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多