工具栏微调器奇怪的行为

ToolBar Spinner Odd Behavior

我正在使用工具栏微调器在我的应用程序的 6 个活动之间切换。打开的 activity,我称之为 MainView,只有微调器 [加上工具栏操作菜单上的帮助 link]。用户 select 从微调器中选择他希望 运行 的其他 5 个活动中的哪一个,完成后使用 activity 的工具栏后退按钮 return 到 MainView。 =14=]

一切正常,除了在从任何其他活动 return 转到 MainView 之后,那个 activity 的名称仍然显示在 Spinner 中,而不是我预期的 MainView。另外,如果用户想要 return 到同一个 activity,他必须先 select 其他任何一个。

我原以为当 App returns 使用工具栏后退按钮转到 MainView 时,它会通过调用 MainView OnCreate 来执行此操作,并且会重新创建 MainView 微调器,从而显示 MainView。但事实并非如此。

我已经尝试了一些方法,包括 onCreate 中的 setSelection(0),重新初始化 onStart 和 onResume 中的微调器 - 但 none 有所不同。希望能帮到你。

xml 微调器 ...

<Spinner
    android:id="@+id/spinner_main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

微调器的初始化代码

    String[] mainview_names = new String[]
        {"MainView", "WebView", "JsoupView", "CodeView", "Connectivity", "FtpView"};
    Spinner mainSpinner = (Spinner) findViewById(R.id.spinner_main);
    ArrayAdapter<String> adapter = new ArrayAdapter<>
        (this,android.R.layout.simple_spinner_dropdown_item, mainview_names);
    mainSpinner.setAdapter(adapter);
    mainSpinner.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    //        mainSpinner.setSelection(0);

倾听者...

public class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener {

        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            switch (pos){
                case 0:                 // Main View
                    break;
                case 1:                 // Web View
                    BrowseWWW();
                    break;
                case 2:                 // Jsoup View
                    LoadHTMLJsoup();
                    break;
                case 3:                 // Code View
                    LoadHTMLCode();
                    break;
                case 4:                 // Connectivity
                    GetHTMLConn();
                    break;
                case 5:                 // Ftp View
                    GetHTMLFtp();
                    break;
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }
    }

编辑:附加信息:

这 5 个 Activity 分别使用如下结构的代码响应后退按钮。

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        help.setVisibility(View.GONE);
        switch (item.getItemId()){

            case android.R.id.home:     // up navigation
                finish();
            return true;

            case R.id.load:
        //  ....
                }
            return true;

            case R.id.Clear
        //  ...
            return true;
            }
        return false;
    }

@Override
    public void finish() {
        Intent i = new Intent();
        i.putExtra("urlKey", url.getText().toString());
        i.putExtra("tokenKey", token.getText().toString());
        i.putExtra("redirectsKey", HttpURLConnection.getFollowRedirects());
        setResult(RESULT_OK, i);
        super.finish();
    }

好的微调器状态问题:

在不深入研究您的代码的情况下,这是我的理论:

您在 activity A。你 select 微调器中的东西,说 B。现在您处于 activity B 并且 activity A 暂停并保留它的状态 - 即它具有对应于 B [=49= 的项目] 在微调器中编辑。当您从 B 返回时,activity A 会恢复到那个确切的状态,当然,微调器中仍然有 B 项目。您不能立即再次转到 B,因为如果您重新 select B,您的 select 处理程序将不会被调用(因为没有变化)。

Activity 每次都不会被销毁的事实可能是欺骗了你,这就是为什么你应该看看 google guide on Activities -- 它可能会为你节省一个很多猜测时间:)

因此,要解决微调器的问题,您应该覆盖每个 activity 的 onResume() 方法,并使用它将微调器设置为与 activity 对应的状态 - - 这是简短的版本。

长版本是,您可能有点逆流 使用工具栏微调器在活动之间导航。

导航可以更快更直观您将 Web、Jsoup、代码和其他顶级视图实现为 Fragments (also, this) inside a single Activity, that's exactly what they're for. It'll probably be more user-friendly to use Tabs 而不是 Spinner