android - que - ShareActionProvider con una barra de acción dividida
poner toolbar android studio (3)
Algunos cómo la creación de un archivo de historial de acciones soluciona este problema
Esto puede solucionarse utilizando un archivo de historial de acciones personalizado en la instalación de la aplicación.
por ejemplo, llame a CreateShareHisotryFile () en la aplicación Create ()
public class YourBrokenAPP extends Application {
public static SHARE_HISTORY_FILE_NAME = "c_share_hist.xml";
@Override
public void onCreate() {
super.onCreate();
CreateShareHisotryFile();
}
private void CreateShareHisotryFile() {
String data = "<?xml version=''1.0'' encoding=''UTF-8'' standalone=''yes'' ?> "+
"<historical-records>" +
"<historical-record activity=/"com.google.android.apps.plus/com.google.android.libraries.social.gateway.GatewayActivity/" time=/"1426500217970/" weight=/"1.0/" />"+
"</historical-records>";
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(SHARE_HISTORY_FILE_NAME, Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}
luego, en el fragmento en el archivo de historial de uso compartido de onCreateOptionsMenu que acabamos de crear ...
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
// Set up ShareActionProvider''s default share intent
MenuItem shareItem = menu.findItem(R.id.action_share);
mShareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareHistoryFileName(c_share_hist.xml);
}
Tenga en cuenta que los registros históricos necesitan al menos un elemento secundario de registro histórico en el archivo xml
entonces todo está bien DISFRUTAR .......
Estoy usando un ShareActionProvider
y me gustaría aprovechar la barra de acción dividida cuando no hay suficiente espacio para ella en la parte superior - android:uiOptions="splitActionBarWhenNarrow"
.
La acción funciona bien cuando la ActionBar no necesita dividirse:
Sin embargo, cuando la ActionBar necesita dividirse, el ActionProvider parece romper completamente el diseño inferior de la ActionBar. Llena toda la ventana gráfica debajo de la barra de acción superior y la acción en sí no aparece:
¿Alguien ha podido usar estas dos características juntas con éxito?
Esto se ha corregido en la rama dev de ActionBarSherlock- https://github.com/JakeWharton/ActionBarSherlock/issues/505
Podrías intentar eso en su lugar.
ACTUALIZACIÓN: Ahora arreglado en ActionBarSherlock 4.2.0
Si no importa, puedes usar ActionBarSherlock, este ejemplo de demos:
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.actionbarsherlock.sample.demos;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.ShareActionProvider;
/**
* This activity demonstrates how to use an {@link android.view.ActionProvider}
* for adding functionality to the Action Bar. In particular this demo is adding
* a menu item with ShareActionProvider as its action provider. The
* ShareActionProvider is responsible for managing the UI for sharing actions.
*/
public class ShareActionProviders extends SherlockActivity {
private static final String SHARED_FILE_NAME = "shared.png";
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(SampleList.THEME); //Used for theme switching in samples
super.onCreate(savedInstanceState);
setContentView(R.layout.text);
((TextView)findViewById(R.id.text)).setText(R.string.share_action_providers_content);
copyPrivateRawResuorceToPubliclyAccessibleFile();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate your menu.
getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);
// Set file with share history to the provider and set the share intent.
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// Note that you can set/change the intent any time,
// say when the user has selected an image.
actionProvider.setShareIntent(createShareIntent());
//XXX: For now, ShareActionProviders must be displayed on the action bar
// Set file with share history to the provider and set the share intent.
//MenuItem overflowItem = menu.findItem(R.id.menu_item_share_action_provider_overflow);
//ShareActionProvider overflowProvider =
// (ShareActionProvider) overflowItem.getActionProvider();
//overflowProvider.setShareHistoryFileName(
// ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// Note that you can set/change the intent any time,
// say when the user has selected an image.
//overflowProvider.setShareIntent(createShareIntent());
return true;
}
/**
* Creates a sharing {@link Intent}.
*
* @return The sharing intent.
*/
private Intent createShareIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
return shareIntent;
}
/**
* Copies a private raw resource content to a publicly readable
* file such that the latter can be shared with other applications.
*/
private void copyPrivateRawResuorceToPubliclyAccessibleFile() {
InputStream inputStream = null;
FileOutputStream outputStream = null;
try {
inputStream = getResources().openRawResource(R.raw.robot);
outputStream = openFileOutput(SHARED_FILE_NAME,
Context.MODE_WORLD_READABLE | Context.MODE_APPEND);
byte[] buffer = new byte[1024];
int length = 0;
try {
while ((length = inputStream.read(buffer)) > 0){
outputStream.write(buffer, 0, length);
}
} catch (IOException ioe) {
/* ignore */
}
} catch (FileNotFoundException fnfe) {
/* ignore */
} finally {
try {
inputStream.close();
} catch (IOException ioe) {
/* ignore */
}
try {
outputStream.close();
} catch (IOException ioe) {
/* ignore */
}
}
}
}