Changing configuration at runtime
You might want to change the configuration used to display your documents at runtime. This can easily be achieved when using PdfActivity or PdfFragment. Continue reading for instructions on how to change the configuration for each of these.
Changing the configuration of the PdfActivity
To change the configuration of the PdfActivity, call PdfActivity#setConfiguration, which will take care of saving the state and recreating the activity with the new configuration:
class DynamicConfigurationActivity : PdfActivity() {
override fun onPrepareOptionsMenu(menu: Menu): Boolean { super.onPrepareOptionsMenu(menu) menuInflater.inflate(R.menu.dynamic_configuration_menu, menu) return true }
override fun onOptionsItemSelected(item: MenuItem): Boolean { var handled = false when (item.itemId) { R.id.toggle_scroll_direction -> { handled = true // Create the configuration builder with the configuration prefilled from the current configuration. val newConfiguration = PdfActivityConfiguration.Builder(configuration) .scrollDirection( if (configuration.configuration.scrollDirection == PageScrollDirection.HORIZONTAL) PageScrollDirection.VERTICAL else PageScrollDirection.HORIZONTAL) .build() // Set the configuration on the activity. This will recreate the activity, similar to changing the orientation or language. configuration = newConfiguration } } return handled || super.onOptionsItemSelected(item) }}public class DynamicConfigurationActivity extends PdfActivity {
@Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); getMenuInflater().inflate(R.menu.dynamic_configuration_menu, menu); return true; }
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { boolean handled = false; PdfActivityConfiguration configuration = getConfiguration(); switch (item.getItemId()) { case R.id.toggle_scroll_direction: { handled = true; // Create the configuration builder with the configuration prefilled from the current configuration. PdfActivityConfiguration newConfiguration = new PdfActivityConfiguration.Builder(getConfiguration()) .scrollDirection( configuration.getConfiguration().getScrollDirection() == PageScrollDirection.HORIZONTAL ? PageScrollDirection.VERTICAL : PageScrollDirection.HORIZONTAL) .build(); // Set the configuration on the activity. This will recreate the activity, similar to changing the orientation or language. setConfiguration(newConfiguration); break; } } return handled || super.onOptionsItemSelected(item); }}If you want to change the configuration immediately after the activity is opened, we recommend doing it before onCreate(). In this case, we won’t restart the current activity, thereby making the configuration change much quicker:
class StartupConfigurationChangeActivity : PdfActivity() {
override fun onCreate(savedInstanceState: Bundle) { val newConfiguration = PdfActivityConfiguration.Builder(configuration) // Change your configuration. ... .build()
// Set the new configuration. this.configuration = newConfiguration
// Make sure to call `super.onCreate()` on the parent `PdfActivity`. super.onCreate(savedInstanceState) }}public class StartupConfigurationChangeActivity extends PdfActivity {
@Override protected void onCreate(Bundle savedInstanceState) { PdfActivityConfigurations newConfiguration = PdfActivityConfiguration.Builder(configuration) // Change your configuration. ... .build();
// Set the new configuration. setConfiguration(newConfiguration);
// Make sure to call `super.onCreate()` on the parent `PdfActivity`. super.onCreate(savedInstanceState); }}Changing the configuration of the PdfFragment
To change the configuration of the PdfFragment, you need to:
- Save the state of your current fragment using
PdfFragment#getState. - Create a new fragment with the desired configuration using
PdfFragment#newInstance. - Replace the original fragment with the new one.
- Restore the state using
PdfFragment#setState.
/** The currently displayed `PdfFragment`. **/private var fragment: PdfFragment? = null set(fragment) { // Remove the previous fragment. this.fragment?.let { it.removeDocumentListener(this) } field = fragment if (fragment != null) { // Replace the old fragment with a new one. supportFragmentManager .beginTransaction() .replace(R.id.fragmentContainer, fragment) .commit() // Register the activity to be notified when the document is loaded. fragment.addDocumentListener(this) } }
/** Switches between horizontal and vertical scrolling. */private fun toggleScrollDirection() { val currentFragment = fragment val currentDocument = fragment?.document if (currentFragment == null || currentDocument == null || currentFragment.configuration == null) return
val scrollDirection = currentFragment.configuration.scrollDirection
// Copy the existing configuration to a new configuration builder. val configurationBuilder = PdfConfiguration.Builder(currentFragment.configuration)
// Toggle the scroll direction. configurationBuilder.scrollDirection( if (scrollDirection == PageScrollDirection.HORIZONTAL) PageScrollDirection.VERTICAL else PageScrollDirection.HORIZONTAL)
// Save the old fragment state. val state = currentFragment.state // Create the fragment with the already loaded document and the new configuration. val newFragment = PdfFragment.newInstance(currentDocument, configurationBuilder.build()) fragment = newFragment // Restore the fragment state. newFragment.state = state}/** The currently displayed `PdfFragment`. **/private PdfFragment fragment;
/** Replaces the currently displayed fragment. */private void setFragment(@NonNull PdfFragment fragment) { // Remove the previous fragment. if (this.fragment != null) { this.fragment.removeDocumentListener(this); } this.fragment = fragment;
// Replace the old fragment with a new one. getSupportFragmentManager() .beginTransaction() .replace(R.id.fragmentContainer, fragment) .commit();
// Register the activity to be notified when the document is loaded. fragment.addDocumentListener(this);}
/** Switches between horizontal and vertical scrolling. */private void toggleScrollDirection() { if (fragment == null || fragment.getDocument() == null || fragment.getConfiguration() == null) return;
PageScrollDirection scrollDirection = fragment.getConfiguration().getScrollDirection();
// Copy the existing configuration to a new configuration builder. PdfConfiguration.Builder configurationBuilder = new PdfConfiguration.Builder(fragment.getConfiguration());
// Toggle the scroll direction. configurationBuilder.scrollDirection( scrollDirection == PageScrollDirection.HORIZONTAL ? PageScrollDirection.VERTICAL : PageScrollDirection.HORIZONTAL);
// Save the old fragment state. Bundle state = fragment.getState(); // Create the fragment with the already loaded document and the new configuration. PdfFragment newFragment = PdfFragment.newInstance(fragment.getDocument(), configurationBuilder.build()); setFragment(newFragment); // Restore the fragment state. newFragment.setState(state);}For more details, you can check out DynamicConfigurationExample and CustomFragmentDynamicConfigurationExample in the Catalog app.