Programmatically add a transition name to the title bar of the toolbar (Android)

Is it possible to programmatically set the xml transitionName property to the Toolbar header and then use it to animate using ActivityOptionsCompat ?

This is how I declare my Toolbar :

  Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); myToolbar.setTitle("title"); 

And this is my xml declaration:

 <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/primary_color" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" android:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

To add animation, I have to use the following code:

 ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, albumCoverImageView, // The view which starts the transition (Should be myToolbar title) transitionName // The transitionName of the view ); ActivityCompat.startActivity(activity, intent, options.toBundle()); 

How to pass Toolbar title ( TextView ?) To makeSceneTransitionAnimation function?

+2
java android
source share
2 answers

Yes it is possible:

classes extending ViewCompat can call setTransitionName(String name)

eg:

 myToolbar.setTransitionName("ToolbarTransition"); 

UPDATE seems like you are specifically trying to share the header, so I would do something like the following:

Example xml for MainActivity:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.divshark.toolbaranimation.MainActivity" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <android.support.v7.widget.AppCompatTextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="@android:color/white" android:text="Activity Title" /> </android.support.v7.widget.Toolbar> <android.support.v7.widget.AppCompatButton android:id="@+id/btnNext" android:text="Next" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> 

Then in your Activity task, which view is:

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); final AppCompatTextView mTextView = (AppCompatTextView) mToolbar.findViewById(R.id.tv_title); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mTextView.setTransitionName("SimpleTransition"); } AppCompatButton mBtnNext = (AppCompatButton) findViewById(R.id.btnNext); mBtnNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent secondActivity = new Intent(MainActivity.this, SecondActivity.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, mTextView, mTextView.getTransitionName()); startActivity(secondActivity, options.toBundle()); } else { startActivity(secondActivity); } } }); } } 

then in your SecondActivity:

 public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_activity); AppCompatTextView mTextView = (AppCompatTextView) findViewById(R.id.tv_title); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mTextView.setTransitionName("SimpleTransition"); } } } 

using this xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.AppCompatTextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:layout_centerInParent="true" android:textColor="@android:color/black" android:text="Activity Title" /> </RelativeLayout> 

as you can see that you are allowed to programmatically call setTransitionName (string name) using ViewCompat views

Good luck and happy coding!

+4
source share

You can get a TextView instance of the Toolbar header and set the transition by running the following code:

 private Toolbar mToolbar; private TextView mTextViewToolbarTitle; @Override protected void onCreated(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); mToolbar = (Toolbar) findViewById(R.id.your_toolbar_id); setSupportActionBar(mToolbar); mTextViewToolbarTitle = getTextViewTitle(mToolbar); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mTextViewTitle.setTransitionName(getString(R.string.your_transition_name)); } } 

Copy this method into your activity:

 public static TextView getTextViewTitle(Toolbar toolbar){ TextView textViewTitle = null; for(int i = 0; i<toolbar.getChildCount(); i++) { View view = toolbar.getChildAt(i); if(view instanceof TextView) { textViewTitle = (TextView) view; break; } } return textViewTitle; } 

then start your new activity with the transition:

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(this, mTextViewToolbarTitle, getString(R.string.your_transition_name)) .toBundle()); } else { startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()); } 
+9
source share

All Articles