アンドロイドアプリを開発していて、入力フォームのアクティビティでレイアウトを整理しようとしています。私はこのサンプルのような私の活動のレイアウトを整理したいと思います(Googleアンドロイドのドキュメントにあります):https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0Bzhp5Z4wHba3Skg2b19UVS1LSmc/components_textfields_labels2.png。したがって、大きなアプリケーションバーには、ユーザーのアクティビティの名前と説明を参照する1つまたは2つのテキストフィールドが含まれ、残りの入力コントロールにはアクティビティレイアウトのコンテンツ内に含まれます。アンドロイドのappBar /ツールバーのタイトルを複数回設定する問題
- 活動のタイトルは最初は空であると私はツールバーを降りたときに、ツールバーは、テキスト入力が表示され
- を崩壊し、ユーザーが崩壊するとき、ユーザは、いくつかのテキスト
- を挿入します。私は達するだろう 動作ですアクティビティのタイトル(つまり、ツールバーのタイトル)を入力テキスト値に設定する必要があります。
このメカニズムが動作するのは1回だけです。一度値を設定してツールバーを閉じると、再びツールバー、テキストを設定するinp utの値を変更してツールバーを折りたたむと、タイトルは設定されません。つまり、setTitleは初めて効果がありません。
私は今、自分のコードが一覧表示されます:私は、カスタムアプリバーのレイアウト、崩壊ツールバーのレイアウト、次のようにツールバーとテキスト入力を使用しようとしました:
MyAppBarLayoutがクラスである<?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>
(コードは私ではない、私は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);
}
});
提案がありますか?
おかげで、 ダヴィデ
「onStateChange」が呼び出されていない可能性がありますか?そこにブレークポイントを設定しようとしましたか? –
はい!ただし、setTitle()メソッドは効果がありません。 –
'setOnStateChangeListener'の' getSupportActionBar.setTitle(value); 'のようにタイトルを変更する必要があります –