ToolBar Spinner奇怪行为

时间:2015-09-02 19:50:12

标签: android spinner toolbar

我正在使用ToolBar Spinner在我的应用程序的6个活动之间切换。我称之为MainView的开放活动只有微调器[加上ToolBar操作菜单上的帮助链接]。用户从微调器中选择他希望运行的其他5个活动中的哪一个,并在完成后使用该活动的ToolBar后退按钮返回到MainView。

一切正常,除了从任何其他活动返回MainView后,该活动的名称仍然显示在Spinner中,而不是我预期的MainView。另外,如果用户想要返回相同的活动,他必须先选择其他活动。

我原以为当App使用ToolBar后退按钮返回MainView时,它会通过调用MainView OnCreate来实现,并且会重新创建MainView微调器,从而显示MainView。但事实并非如此。

我在onCreate中尝试过一些事情,包括setSelection(0),重新初始化onStart和onResume中的微调器 - 但没有一个有所作为。希望你能帮忙。

xml for spinner ...

<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个活动每个响应后退按钮,代码结构如下。

@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();
    }

1 个答案:

答案 0 :(得分:1)

好的旋转器状态问题:

没有深入研究更多代码,这是我的理论:

您正在参与活动A。你在微调器中选择一些东西,比如说B。现在,您处于活动状态B,活动A暂停保留状态 - 即它具有与在微调器中选择的B对应的项目。当您从B返回时,活动A将恢复到该确切状态,当然,仍然在微调器中有B项。您无法立即再次转到B,因为如果您重新选择B,则不会调用您的选择处理程序(因为没有更改)。

Activity每次都没有被破坏的事实可能是你欺骗的原因,这就是为什么你应该看看谷歌guide on Activities - 它可能会为你节省大量的猜测时间:)

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

很长的版本是,你可能会使用工具栏微调器在活动之间进行导航来对抗流

导航可以更快,更直观地将您的Web,Jsoup,代码和其他顶级视图实现为Fragments(另外,this)在一个Activity内,这正是他们的目的是什么。使用Tabs代替Spinner可能会更加用户友好。