【问题标题】:Toolbar title disappearing when changing orientation in collapsed state在折叠状态下更改方向时工具栏标题消失
【发布时间】:2016-11-21 22:58:42
【问题描述】:

我正在尝试创建一个可折叠工具栏,就像 chesesquare 存储库中的工具栏一样,但我遇到了这个问题:

https://www.youtube.com/watch?v=THdxcyEc1CA&feature=youtu.be

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您是否希望工具栏始终展开,否则从纵向到横向的相同状态(打开/关闭)?
  • 那将是可取的,是的,所以与您所处的状态相同,但标题位置正确。

标签: android toolbar


【解决方案1】:

您可以在配置更改(方向)时检查 AppBarLayout 的状态,并将其存储。然后,您可以在应用配置更改后为 AppBarLayout 设置该状态。

public class CheeseDetailActivity extends AppCompatActivity {

public static final String EXTRA_NAME = "cheese_name";
AppBarLayout appBarLayout;
boolean isCollapsed = false;

//state change listener
AppBarLayout.OnOffsetChangedListener toolbarStateListener = new AppBarLayout.OnOffsetChangedListener() {
    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if (verticalOffset == 0) {
            // Collapsed
            isCollapsed = true;
        } else {
            // Not collapsed
            isCollapsed = false;

        }
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    Intent intent = getIntent();
    final String cheeseName = intent.getStringExtra(EXTRA_NAME);

    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    CollapsingToolbarLayout collapsingToolbar =
            (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
    collapsingToolbar.setTitle(cheeseName);

    //getting app bar layout
    appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
    //set listener to listen state change of app bar layout
    appBarLayout.addOnOffsetChangedListener(toolbarStateListener);

    loadBackdrop();
}


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    //save state on orientation change
    savedInstanceState.putBoolean("isCollapsed", isCollapsed);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //get state on orientation change
    isCollapsed = savedInstanceState.getBoolean("isCollapsed");
}

@Override
protected void onResume() {
    super.onResume();
    //set state of app bar layout
    appBarLayout.setExpanded(isCollapsed);
}

private void loadBackdrop() {
    final ImageView imageView = (ImageView) findViewById(R.id.backdrop);
    Glide.with(this).load(Cheeses.getRandomCheeseDrawable()).centerCrop().into(imageView);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sample_actions, menu);
    return true;
}
}

我在 CheeseSquare 存储库中编辑了 CheeseDetailActivity。

【讨论】:

  • 这不起作用,我想要的是工具栏保持相同的状态(这已经在默认行为中发生)但标题始终位于正确的位置。如果您查看视频,您会看到旋转设备后标题消失了。
  • 你检查了code.google.com/p/android/issues/detail?id=184950。此问题已关闭。您可以使用新版本的支持库来避免这种情况。我正在使用支持库版本 25.0.1。在这方面它工作得很好。
  • 你是对的,最新版本不会发生这种情况。
【解决方案2】:

在 onConfigurationChanged 你可以尝试运行

handler.postDelayed(new Runnable(){
     @Overrride
     public void run(){
         toolbar.invalidate();
     }
},[Try different time lapses(miliseconds)]);

【讨论】:

  • 但这会很明显不是吗?
  • 你试过了吗?也许是太快了以至于不明显。我知道这很hacky,但我不知道如何解决这个xD
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
相关资源
最近更新 更多