2012-02-06 15 views
19

Sto utilizzando uno ShareActionProvider e vorrei sfruttare la divisione ActionBar quando non c'è abbastanza spazio per la parte superiore - android:uiOptions="splitActionBarWhenNarrow".ShareActionProvider con una divisione ActionBar

L'azione funziona bene quando l'ActionBar non ha bisogno di dividere:

landscape

Tuttavia quando l'ActionBar ha bisogno di dividere, l'ActionProvider sembra rompere completamente il layout ActionBar inferiore. Si riempie l'intera finestra di sotto della ActionBar superiore e l'azione stessa non compare:

portrait

nessuno è stato in grado di utilizzare queste due caratteristiche insieme con successo?

+2

Piattaforma bug report archiviato: http://code.google.com/p/androi d/issues/detail? id = 26027 –

+0

Ho fissato il problema per te. Lo stesso problema qui. Ottengo lo stesso errore usando l'ultimo disponibile a partire da questo commento. Barra di azione Appcompat. – danny117

risposta

0

Se non importa, è possibile utilizzare ActionBarSherlock, questo esempio da demo: Portrait Landscape Landscape expand

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

+1

Sbagliato. Se si utilizza una barra di azione divisa con quella demo ('android: uiOptions =" ​​splitActionBarWhenNarrow "') presenta esattamente lo stesso problema su pre-ICS con ActionBarSherlock come con l'implementazione nativa. –

1

Alcuni come la creazione di una storia quota fissa di file questo problema

questo può essere risolto utilizzando un file di cronologia condivisione personalizzata sulla installazione di app.

ad es. chiamare CreateShareHisotryFile() su App 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()); 
    } 
} 

poi nel onCreateOptionsMenu file della cronologia uso la parte del frammento che abbiamo appena creato ....

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

Nota che storico-record ha bisogno di almeno un @ storico- elemento figlio record nel file XML

allora va tutto bene GODERE .......

Problemi correlati