从 onPostExecute(String result) 开始活动不设置 ui 标志

Posted

技术标签:

【中文标题】从 onPostExecute(String result) 开始活动不设置 ui 标志【英文标题】:Starting activity from onPostExecute(String result) doesn't set ui flags 【发布时间】:2016-10-15 10:09:06 【问题描述】:

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

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

第一个活动中的 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

.....

@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 标志

【问题讨论】:

您可以尝试在onStart() 中设置这些标志吗? 似乎没有什么不同:-) 您可以尝试在开始活动之前将这些标志添加到意图中吗? 是否只是像这样添加它们的一种情况 intent.setFlags( 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);还需要什么吗?这目前不起作用 你的意思是说当你点击“登录”按钮时,一切正常。但是当你从键盘点击“完成”按钮时,就会出现问题。 【参考方案1】:

只需从 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;
          
      );

我已经检查过了,它对我来说工作正常。

希望对你有所帮助ツ

【讨论】:

嗨 SweetWisher,这确实有效,你能解释一下为什么吗? 从文档中,它说 如果你已经消费了这个动作,则返回 true,否则返回 false。 我猜返回 TRUE 正在处理其他事情:|这对我来说也是一个问题。 是的,这对我来说已经足够好了,但奇怪的问题仍然存在,我不可能是第一个遇到这个问题的人。任何方式感谢您的帮助【参考方案2】:

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

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

【讨论】:

以上是关于从 onPostExecute(String result) 开始活动不设置 ui 标志的主要内容,如果未能解决你的问题,请参考以下文章

完成 AsyncTask 后未调用 onPostExecute

onPostExecute() 无法重新运行从活动调用的 asyncTask

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

从 onPostExecute 中的另一个类调用方法导致 nullPointerException

从onPostExecute返回字符串

如果我有一个扩展的单独的类,如何从onPostExecute()获取值 类?