ShareActionProvider与拆分的ActionBar

我正在使用ShareActionProvider并希望在顶部没有足够空间的情况下利用分离的ActionBar – android:uiOptions="splitActionBarWhenNarrow"

当ActionBar不需要分割时,该动作可以正常工作:

景观

但是,当ActionBar确实需要拆分时,ActionProvider似乎完全打破了较低的ActionBar布局。 它填充顶部ActionBar下面的整个视口,并且操作本身不显示:

肖像

有没有人能成功地使用这两个function?

这已经在ActionBarSherlock的开发分支中修复 – https://github.com/JakeWharton/ActionBarSherlock/issues/505

你可以尝试一下。

更新:现在在ActionBarSherlock 4.2.0中修复

一些如何创build共享历史logging文件修复了这个问题

这可以通过在应用程序安装上使用自定义共享历史logging文件来解决。

例如在App Create()上调用CreateShareHisotryFile()

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

然后在片段的onCreateOptionsMenu使用共享历史文件,我们刚刚创build….

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

请注意,历史logging在xml文件中至less需要一个历史logging子元素

那么一切都很好享受…….

如果没关系,可以使用ActionBarSherlock,这个例子来自于演示: 肖像景观景观扩大

 /* * 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 */ } } } } 

https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/demos/src/com/actionbarsherlock/sample/demos/ShareActionProviders.java