2016-04-23 14 views
1

アンドロイドアプリを開発していて、入力フォームのアクティビティでレイアウトを整理しようとしています。私はこのサンプルのような私の活動のレイアウトを整理したいと思います(Googleアンドロイドのドキュメントにあります):https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0Bzhp5Z4wHba3Skg2b19UVS1LSmc/components_textfields_labels2.png。したがって、大きなアプリケーションバーには、ユーザーのアクティビティの名前と説明を参照する1つまたは2つのテキストフィールドが含まれ、残りの入力コントロールにはアクティビティレイアウトのコンテンツ内に含まれます。アンドロイドのappBar /ツールバーのタイトルを複数回設定する問題

  1. 活動のタイトルは最初は空であると私はツールバーを降りたときに、ツールバーは、テキスト入力が表示され
  2. を崩壊し、ユーザーが崩壊するとき、ユーザは、いくつかのテキスト
  3. を挿入します。私は達するだろう 動作ですアクティビティのタイトル(つまり、ツールバーのタイトル)を入力テキスト値に設定する必要があります。

このメカニズムが動作するのは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); 
    } 
}); 

提案がありますか?

おかげで、 ダヴィデ

+0

「onStateChange」が呼び出されていない可能性がありますか?そこにブレークポイントを設定しようとしましたか? –

+0

はい!ただし、setTitle()メソッドは効果がありません。 –

+0

'setOnStateChangeListener'の' getSupportActionBar.setTitle(value); 'のようにタイトルを変更する必要があります –

答えて

0

あなたは、このようなタイトルを変更する必要がthis answer

+2

既に試しました。ツールバーのタイトルは1回だけ変更されます。 –

0

で述べたように

getSupportActionBar().setTitle(value) 

toolbar.setTitle(value) 

を交換してみてください: の代わりに、

toolbar.setTitle(value);

setOnStateChangeListener

getSupportActionBar.setTitle(value);

を行う

+1

いいえ、それは動作しません! –

0

それは良い解決策ではないかもしれないが、すべてのものの作業を取得するための1つの方法は、カスタムアクションバーを作成することです 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。クラス

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); 
    } 

} 
関連する問題