I am using CollapsingToolBarLayout
alongside with AppBarLayout
and CoordinatorLayout
, and they are working Fine altogether. I set my Toolbar
to be fixed when I scroll up, I want to know if there is a way to change the title text of the Toolbar, when CollapsingToolBarLayout
it is collapsed.
Wrapping up, I want two different titles when scrolled and when expanded.
Thank you all in advance
答案 0 :(得分:116)
我基于@Frodio Beggins和@Nifhel代码分享了完整的实现:
public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener {
public enum State {
EXPANDED,
COLLAPSED,
IDLE
}
private State mCurrentState = State.IDLE;
@Override
public final void onOffsetChanged(AppBarLayout appBarLayout, int i) {
if (i == 0) {
if (mCurrentState != State.EXPANDED) {
onStateChanged(appBarLayout, State.EXPANDED);
}
mCurrentState = State.EXPANDED;
} else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {
if (mCurrentState != State.COLLAPSED) {
onStateChanged(appBarLayout, State.COLLAPSED);
}
mCurrentState = State.COLLAPSED;
} else {
if (mCurrentState != State.IDLE) {
onStateChanged(appBarLayout, State.IDLE);
}
mCurrentState = State.IDLE;
}
}
public abstract void onStateChanged(AppBarLayout appBarLayout, State state);
}
然后你可以使用它:
appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {
@Override
public void onStateChanged(AppBarLayout appBarLayout, State state) {
Log.d("STATE", state.name());
}
});
答案 1 :(得分:72)
此解决方案非常适合我检测AppBarLayout
折叠或展开。
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0)
{
// Collapsed
}
else
{
//Expanded
}
}
});
在addOnOffsetChangedListener
上使用AppBarLayout
。
答案 2 :(得分:33)
将OnOffsetChangedListener
挂钩到AppBarLayout
。当verticalOffset
达到0或小于Toolbar
高度时,表示CollapsingToolbarLayout已折叠,否则正在展开或展开。
mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if(verticalOffset == 0 || verticalOffset <= mToolbar.getHeight() && !mToolbar.getTitle().equals(mCollapsedTitle)){
mCollapsingToolbar.setTitle(mCollapsedTitle);
}else if(!mToolbar.getTitle().equals(mExpandedTitle)){
mCollapsingToolbar.setTitle(mExpandedTitle);
}
}
});
答案 3 :(得分:16)
这段代码对我有用
mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset == -mCollapsingToolbarLayout.getHeight() + mToolbar.getHeight()) {
//toolbar is collapsed here
//write your code here
}
}
});
答案 4 :(得分:13)
private enum State {
EXPANDED,
COLLAPSED,
IDLE
}
private void initViews() {
final String TAG = "AppBarTest";
final AppBarLayout mAppBarLayout = findViewById(R.id.appbar);
mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
private State state;
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset == 0) {
if (state != State.EXPANDED) {
Log.d(TAG,"Expanded");
}
state = State.EXPANDED;
} else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
if (state != State.COLLAPSED) {
Log.d(TAG,"Collapsed");
}
state = State.COLLAPSED;
} else {
if (state != State.IDLE) {
Log.d(TAG,"Idle");
}
state = State.IDLE;
}
}
});
}
答案 5 :(得分:7)
您可以使用以下内容获取collapsingToolBar alpha百分比:
appbarLayout.addOnOffsetChangedListener( new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
float percentage = ((float)Math.abs(verticalOffset)/appBarLayout.getTotalScrollRange());
fadedView.setAlpha(percentage);
});
供参考:link
答案 6 :(得分:2)
这个解决方案对我有用:
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
if (i == 0) {
if (onStateChangeListener != null && state != State.EXPANDED) {
onStateChangeListener.onStateChange(State.EXPANDED);
}
state = State.EXPANDED;
} else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) {
if (onStateChangeListener != null && state != State.COLLAPSED) {
onStateChangeListener.onStateChange(State.COLLAPSED);
}
state = State.COLLAPSED;
} else {
if (onStateChangeListener != null && state != State.IDLE) {
onStateChangeListener.onStateChange(State.IDLE);
}
state = State.IDLE;
}
}
在AppBarLayout上使用addOnOffsetChangedListener。
答案 7 :(得分:1)
这是科特林解决方案。将OnOffsetChangedListener
添加到AppBarLayout
。
方法A:
将AppBarStateChangeListener.kt
添加到您的项目:
import com.google.android.material.appbar.AppBarLayout
import kotlin.math.abs
abstract class AppBarStateChangeListener : AppBarLayout.OnOffsetChangedListener {
enum class State {
EXPANDED, COLLAPSED, IDLE
}
private var mCurrentState = State.IDLE
override fun onOffsetChanged(appBarLayout: AppBarLayout, i: Int) {
if (i == 0 && mCurrentState != State.EXPANDED) {
onStateChanged(appBarLayout, State.EXPANDED)
mCurrentState = State.EXPANDED
}
else if (abs(i) >= appBarLayout.totalScrollRange && mCurrentState != State.COLLAPSED) {
onStateChanged(appBarLayout, State.COLLAPSED)
mCurrentState = State.COLLAPSED
}
else if (mCurrentState != State.IDLE) {
onStateChanged(appBarLayout, State.IDLE)
mCurrentState = State.IDLE
}
}
abstract fun onStateChanged(
appBarLayout: AppBarLayout?,
state: State?
)
}
将侦听器添加到您的appBarLayout
:
appBarLayout.addOnOffsetChangedListener(object: AppBarStateChangeListener() {
override fun onStateChanged(appBarLayout: AppBarLayout?, state: State?) {
Log.d("State", state.name)
when(state) {
State.COLLAPSED -> { /* Do something */ }
State.EXPANDED -> { /* Do something */ }
State.IDLE -> { /* Do something */ }
}
}
}
)
方法B:
appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
if (abs(verticalOffset) - appBarLayout.totalScrollRange == 0) {
// Collapsed
} else if (verticalOffset == 0) {
// Expanded
} else {
// Idle
}
}
)
答案 8 :(得分:0)
如果您使用的是CollapsingToolBarLayout,则可以使用此
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(SupportProcessViewModel vm)
{
if (!ModelState.IsValid)
{
return View(vm);
{
// Get the item
var sp = db.SupportProcesses.FirstOrDefault(p => p.Id == vm.SupportProcess.ProcessId);
// Set the new values
if (vm.SelectedStartProcess > 0)
{
sp.StartProcessId = vm.SelectedStartProcess;
}
sp.Name = vm.SupportProcess.Name;
sp.Description = vm.SupportProcess.Description;
// all the rest values
// Save changes
db.SupportProcesses.Update(sp);
db.SaveChanges();
return RedirectToAction("Index");
}
答案 9 :(得分:0)
这段代码对我来说非常合适。你可以使用百分比刻度你喜欢的方式
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
double percentage = (double) Math.abs(verticalOffset) / collapsingToolbar.getHeight();
if (percentage > 0.8) {
collapsingToolbar.setTitle("Collapsed");
} else {
collapsingToolbar.setTitle("Expanded");
}
}
答案 10 :(得分:0)
这是Kotlin中的解决方案:
abstract class AppBarStateChangeListener : OnOffsetChangedListener {
enum class State {
EXPANDED, COLLAPSED, IDLE
}
private var mCurrentState =
State.IDLE
override fun onOffsetChanged(appBarLayout: AppBarLayout, i: Int) {
mCurrentState = if (i == 0) {
if (mCurrentState != State.EXPANDED) {
onStateChanged(appBarLayout, State.EXPANDED)
}
State.EXPANDED
} else if (Math.abs(i) >= appBarLayout.totalScrollRange) {
if (mCurrentState != State.COLLAPSED) {
onStateChanged(appBarLayout, State.COLLAPSED)
}
State.COLLAPSED
} else {
if (mCurrentState != State.IDLE) {
onStateChanged(appBarLayout, State.IDLE)
}
State.IDLE
}
}
abstract fun onStateChanged(
appBarLayout: AppBarLayout?,
state: State?
)
}
这是听众:
appbar.addOnOffsetChangedListener(object : AppBarStateChangeListener() {
override fun onStateChanged(
appBarLayout: AppBarLayout?,
state: State?
) {
if(state == State.COLLAPSED){
LayoutBottom.visibility = View.GONE
}else if(state == State.EXPANDED){
LayoutBottom.visibility = View.VISIBLE
}
}
})