多次设置android的appBar /工具栏标题的问题

时间:2016-04-23 07:46:01

标签: android android-toolbar android-appbarlayout

我正在开发一个Android应用程序,我一直在组织输入表单活动中的布局。我想组织我的活动布局,例如这个样本(在谷歌android的文档中找到):https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0Bzhp5Z4wHba3Skg2b19UVS1LSmc/components_textfields_labels2.png。因此,一个大的应用栏将包含一个或两个文本字段,引用用户活动的名称和描述,并在活动布局的内容中包含其余的输入控件。 我会达到的行为是:

  1. 活动标题最初为空,工具栏已折叠
  2. 当我下到工具栏时,会显示文本输入,并且用户会插入一些文字
  3. 当用户折叠工具栏时,活动标题(即工具栏标题)必须设置为输入文本值
  4. 问题是这个机制只有一次有效:一旦设置值并折叠工具栏,当我再次关闭工具栏时,设置文本输入值并折叠工具栏,标题未设置,即setTitle第一次没有效果。

    我现在将列出我的代码:我尝试以下列方式使用自定义应用栏布局,折叠工具栏布局,工具栏和文本输入:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:context="com.example.davide.inputformapp.MainActivity">
    
        <com.example.davide.inputformapp.MyAppBarLayout.MyAppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginEnd="@dimen/activity_horizontal_margin"
                app:expandedTitleMarginStart="@dimen/activity_horizontal_margin"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="parallax"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    
                <android.support.design.widget.TextInputEditText
                    android:id="@+id/textInput"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
    
            </android.support.design.widget.CollapsingToolbarLayout>
    
        </com.example.davide.inputformapp.MyAppBarLayout.MyAppBarLayout>
    
    </android.support.design.widget.CoordinatorLayout>
    

    其中MyAppBarLayout是以这种方式定义的类(代码不是我的,我在stackoverflow讨论中找到):

    public class MyAppBarLayout extends AppBarLayout
        implements AppBarLayout.OnOffsetChangedListener {
    
        private State state;
        private OnStateChangeListener onStateChangeListener;
    
        public MyAppBarLayout(Context context) {
            super(context);
        }
    
        public MyAppBarLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            if (!(getLayoutParams() instanceof CoordinatorLayout.LayoutParams)
                    || !(getParent() instanceof CoordinatorLayout)) {
                throw new IllegalStateException(
                        "MyAppBarLayout must be a direct child of CoordinatorLayout.");
            }
            addOnOffsetChangedListener(this);
        }
    
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            if (verticalOffset == 0) {
                if (onStateChangeListener != null && state != State.EXPANDED) {
                    Log.d("MYAPP","---> EXPANDED");
                    onStateChangeListener.onStateChange(State.EXPANDED);
                }
                state = State.EXPANDED;
            } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
                if (onStateChangeListener != null && state != State.COLLAPSED) {
                    Log.d("MYAPP","---> COLLAPSED");
                    onStateChangeListener.onStateChange(State.COLLAPSED);
                }
                state = State.COLLAPSED;
            } else {
                if (onStateChangeListener != null && state != State.IDLE) {
                    Log.d("MYAPP","---> IDLE");
                    onStateChangeListener.onStateChange(State.IDLE);
                }
                state = State.IDLE;
            }
        }
    
        public void setOnStateChangeListener(OnStateChangeListener listener) {
            this.onStateChangeListener = listener;
        }
    
        public interface OnStateChangeListener {
            void onStateChange(State toolbarChange);
        }
    
        public enum State {
            COLLAPSED,
            EXPANDED,
            IDLE
        }
    }
    

    主要活动的onCreate()方法中的代码是:

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    textInput = (TextInputEditText) findViewById(R.id.textInput);
    final MyAppBarLayout collapsableAppBar = (MyAppBarLayout) findViewById(R.id.appbar);
    
    setSupportActionBar(toolbar);
    setTitle(null);
    
    collapsableAppBar.setOnStateChangeListener(new MyAppBarLayout.OnStateChangeListener() {
        @Override
        public void onStateChange(MyAppBarLayout.State toolbarChange) {
            String value = textInput.getText().toString();
            toolbar.setTitle(value);
        }
    });
    

    有什么建议吗?

    谢谢, 的Davide

4 个答案:

答案 0 :(得分:3)

set&#34; android:id&#34;到CollapsingToolbarLayout。在活动中找到它并为其设置标题。 我尝试了很多答案,但只设置了CollapsingToolbarLayout的标题。

答案 1 :(得分:0)

请尝试替换

toolbar.setTitle(value) 

getSupportActionBar().setTitle(value)

this answer

中所述

答案 2 :(得分:0)

你必须改变这样的标题: 而不是

toolbar.setTitle(value);

DO

getSupportActionBar.setTitle(value);

on

setOnStateChangeListener

答案 3 :(得分:0)

它可能不是一个好的解决方案,但让一切工作正常的一种方法是创建自定义操作栏 custom_actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@drawable/yourcolorforactionbar" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textAllCaps="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#fff"
        android:textStyle="bold" />

    <ImageView
        android:id="@+id/myimage"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dp"
        android:src="@drawable/yourimagetoset" />

    <ImageButton
        android:id="@+id/imageButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="8dp"
        android:background="@null"
        android:src="@android:drawable/menubutoon" />

</RelativeLayout>

mainactivity.class

public class MainActivity extends Activity {

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

        ActionBar mActionBar = getActionBar();
        mActionBar.setDisplayShowHomeEnabled(false);
        mActionBar.setDisplayShowTitleEnabled(false);
        LayoutInflater mInflater = LayoutInflater.from(this);

        View mCustomView = mInflater.inflate(R.layout.custom_actionbar, null);
        TextView mTitleTextView = (TextView) mCustomView.findViewById(R.id.title_text);
        mTitleTextView.setText("My Own Title");

        ImageButton imageButton = (ImageButton) mCustomView
                .findViewById(R.id.imageButton);
        imageButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "Refresh Clicked!",
                        Toast.LENGTH_LONG).show();
            }
        });

        mActionBar.setCustomView(mCustomView);
        mActionBar.setDisplayShowCustomEnabled(true);
    }

}