从onPostExecute(String result)启动活动不会设置ui标志

时间:2016-06-14 15:17:37

标签: android android-activity android-asynctask navigationbar

我的总体目标是在我的Android应用中启动活动时隐藏导航栏。

我有两个活动,第一个是登录屏幕并且正在运行异步任务,并且根据结果的结果我开始我的新活动

第一个活动中的OnPostExecute

 .....

 @Override
    protected void onPostExecute(String result)
    {

        try
        {
            if (result.equals("true"))
            {
                Intent intent = new Intent(mContext, MainRota.class);
                startActivity(intent);
                finish();

            }
            else
            {
                CharSequence text = "One or more fields are incorrect!";
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(mContext, text, duration);
                toast.show();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

第二个活动会立即设置ui标志以隐藏导航栏

OnCreate of second activity

.....

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_layout);

    View decorView = getWindow().getDecorView();
 // Hide both the navigation bar and the status bar.
 // SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
 // a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
    int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                             | View.SYSTEM_UI_FLAG_FULLSCREEN
                             | View.SYSTEM_UI_FLAG_IMMERSIVE
                             | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                             | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;

    decorView.setSystemUiVisibility(uiOptions);
}

当第二个活动开始时,几乎就像忽略了标志并且没有隐藏条形图。

如果我直接从第一个活动的onCreate开始第二个活动,它工作正常,但显然我通过我的登录做这个。

有没有人知道为什么会发生这种情况以及如何修复,因为我在主线程上运行onPostExecute,所以在此处启动活动应该没有问题。

更新!!

我找到了造成这个问题的原因,但我仍然不确定原因。

从登录活动中我添加了一个监听器,这样当你输入密码并按下“完成”时,它就会直接登录而不必点击登录按钮。如果我删除此侦听器并返回使用登录按钮,它工作正常。这是我的听众代码。

((EditText)findViewById(R.id.password)).setOnEditorActionListener(
      new EditText.OnEditorActionListener() 
      {
          @Override
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
          {
              if (actionId == EditorInfo.IME_ACTION_SEARCH ||
                          actionId == EditorInfo.IME_ACTION_DONE ||
                          event.getAction() == KeyEvent.ACTION_DOWN &&
                                  event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
                  new GetJSONResult().execute("");
                  return true;
              }
              return false;
          }
      });

这是我的登录按钮

    LoginButton = (Button) findViewById(R.id.loginButton2);
    LoginButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View arg0)
        {
            new GetJSONResult().execute("");
        }
    });

所以现在的问题是,为什么从EditText的侦听器调用asyncTask会导致我从OnPostExecute开始的新活动中忽略systemUI标志

2 个答案:

答案 0 :(得分:3)

只需从OnEditorActionListener方法返回 false 即可。
您的代码稍作修改:

((EditText)findViewById(R.id.password)).setOnEditorActionListener(
      new EditText.OnEditorActionListener() 
      {
          @Override
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
          {
              if (actionId == EditorInfo.IME_ACTION_SEARCH ||
                          actionId == EditorInfo.IME_ACTION_DONE ||
                          event.getAction() == KeyEvent.ACTION_DOWN &&
                                  event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
              {
                  new GetJSONResult().execute("");
              }
              return false;
          }
      });

我已经检查了它,它对我来说很好。

希望这能帮助你ツ

答案 1 :(得分:1)

尝试在UI线程中启动AsyncTask,如:

runOnUiThread(new Runnable(){
    @Override public void run(){
        new GetJSONResult().execute("");
    }
});