2013-04-24 35 views
10

Bağlamsal eylem çubuğunda bazı garip davranışlar var.Içerik eylem çubuğu menü öğesi için garip davranış

Birincisi: bir yol simgeleri olduğunu var mı

: İkinci/üçüncü olarak

Clicking behavior overflow button of CAB

:

Bir menü öğesi yalnızca ben taşma butonuna tıklayın her ikinci kez gösterilmiştir o kadar yer kullanmıyor musun? Ben tüm öğelere özelliği android:showAsAction="always" eklemek değiştirmek

, tüm simgeleri göstermek için aslında yeterli boşluk olduğundan - ama benim paylaş simgesi artık tıklanabilir değil:

All Items with showAsAction always

Temiz Projesi değil yardım et.

Test cihazımdaki (Galaxy S3) Android 4.2.2'yi kullanıyorum.

Hatta (aynı zamanda altta de NavigationBar kaldırıldı SlimBean önce, şimdi CyanogenMod 10.1) tamamen benim XXX GS3 üzerinde yeni ROM flaş çalıştı - yardım etmedi.

Ayrıca bir Nexus 4 denedim. Daha fazla alan var, bu yüzden paylaşım düğmesi ve silme düğmesi görünür. İşlem modunu başlattığımda paylaşım düğmesi tıklanabilir değil, ancak aygıtı manzara moduna döndürdüğümde ve bu işlev tekrar resme döndüğümde hala çalışıyor. Nexus 4’te temel olarak paylaşım düğmesi dönmeden önce çalışmaz.


Bildirim:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> 

minSdkVersion=17 karşı Derleme hiç fark etmez.

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:title="@string/checkAll" 
     android:id="@+id/managementCABCheckAll" 
     android:icon="@android:drawable/checkbox_on_background"> 
    </item> 
    <item 
     android:title="@string/enable" 
     android:id="@+id/managementCABEnable" 
     android:icon="@drawable/sphere_green"> 
    </item> 
    <item 
     android:title="@string/disable" 
     android:id="@+id/managementCABDisable" 
     android:icon="@drawable/sphere_red"> 
    </item> 
    <item 
     android:title="@string/delete" 
     android:id="@+id/managementCABDelete" 
     android:icon="@android:drawable/ic_menu_close_clear_cancel"> 
    </item> 
    <item 
     android:title="@string/share" 
     android:id="@+id/managementCABShare" 
     android:actionProviderClass="android.widget.ShareActionProvider" 
     android:icon="@android:drawable/ic_menu_share"> 
    </item> 
    <item 
     android:title="@string/export" 
     android:id="@+id/managementCABExport" 
     android:icon="@drawable/explorer"> 
    </item> 
</menu> 

:

Böyle bir parçasından Eylem Modu başlatın: ActionMode.Callback yılında

mActionMode = activity.startActionMode(mMultipleCallback); 

menüyü doldurmak: XML burada

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.management_cab, menu); 
    MenuItem item = menu.findItem(R.id.managementCABShare); 
    mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
    //...other stuff 
    return true; 
} 

Ve olduğunu Bütünlük uğruna bütünüyle callback:

protected ActionMode.Callback mMultipleCallback = new ActionMode.Callback() { 

    private ShareActionProvider mShareActionProvider; 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.management_cab, menu); 
     MenuItem item = menu.findItem(R.id.managementCABShare); 
     mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
     hideUnwantedCABItems(menu); 
     return true; 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     List<Integer> checkedPositions = getAllCheckedPositions(); 
     switch (item.getItemId()) { 
     case R.id.managementCABCheckAll: 
      changeCheckedOfAllItems(true); 
      return true; 
     case R.id.managementCABEnable: 
      changeEnabled(checkedPositions, true); 
      return true; 
     case R.id.managementCABDisable: 
      changeEnabled(checkedPositions, false); 
      return true; 
     case R.id.managementCABDelete: 
      if (deleteAlert == null) 
       createDeleteDialog(checkedPositions); 
      initDeleteDialog(checkedPositions); 
      return true; 
     case R.id.managementCABShare: 
      Intent shareIntent = new Intent(); 
      shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 
      shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, exportItemsAndGetUris(checkedPositions)); 
      shareIntent.setType("application/xml"); 
      setShareIntent(shareIntent); 
      return true; 
     case R.id.managementCABExport: 
      String message; 
      if (StorageController.copyUriListToExportFolder(exportItemsAndGetUris(checkedPositions))) 
       message = getActivity().getString(R.string.export_success); 
      else 
       message = getActivity().getString(R.string.export_fail); 

      Toast.makeText(getActivity(), message + ":\n" + StorageController.getExternalExportApplicationFolder(), Toast.LENGTH_LONG).show(); 
      return true; 
     default: 
      return false; 
     } 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     mActionMode = null; 
     changeCheckedOfAllItems(false); 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    private void setShareIntent(Intent shareIntent) { 
     if (mShareActionProvider != null) { 
      mShareActionProvider.setShareIntent(shareIntent); 
     } 
    } 
}; 
+0

Cihazınızda v14 kullanıyorsunuz veya v14 SDK ile derlenmiyor mu? –

+0

wtf neden aşağı oy? her neyse ben cihazımda 4.2.2 kullanın - açıklık için düzenleme kontrol etmek için –

+0

Bu ben v14 karşı derlerseniz, ben en son SDK karşı derlemeyi deneyin Ben değildi. –

cevap

9

Tamam, çıkarılabilir paylaşım simgesinin çözümü. Bu, benim için API’ya bir yanlış anlaşılmadı.

Menünüzdeki XML dosyasındaki diğer tüm öğeler gibi SharedActionProvider-Item gibi davranabileceğinizi düşündüm. Ama aslında yapamazsın. onActionItemClicked, bu simge için bir eylem olarak gösterildiğinde bile tetiklenmez (bu nedenle, showAsAction=always eklendiğinde tıklanabilir değildir).Yeterince komik, ikon gösterilmediğinde tıklama olayı tetiklenir, ancak taşma menüsünde görünür. Bu, bağlamsal eylem çubuğunda gerçek bir hata olabilir!

Şimdi nihayet tetiklemesi gerektiğini nasıl anladım bir SharedActionProvider-Item: Yapmalisin

onCreateActionMode yönteminde bir Intent koymak (!):

public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.management_cab, menu); 
    MenuItem item = menu.findItem(R.id.managementCABShare); 
    initSharedActionProvider(item); //Check out this method in the next code fragment 
    return false; 
} 

Şimdi diyebilirsiniz: "Seni aptal Bu açıktı ve daha önce yaptığınız gibi, onActionItemClicked Metodunda olduğu gibi niyetini her zaman yerine koymak daha da iyidir ".

Üzgünüz, ama katılmıyorum: Burada ayarlamak gerçekten mantıklı değil. Nedeni: Benim için niyet, kontrol ettiğiniz her ek öğe ile değişir. Kontrol ettiğiniz her öğe için bir export-XML dosyası oluşturur ve bir simge tıklandığında her zaman bir XML dosyası oluşturmak istemiyorum. Bu bir anlam ifade etmiyor ve tüm XML dosyalarının sadece bir kullanıcı gerçekten öğeleri dışa aktarmak istediğinde oluşturulmasını istiyorum.

Temel olarak bunun için bir çözüm buldum. Başlangıçta bir Intent yapıp boş bir List<Uri> ekliyorum. Bu liste, sınıfımdaki üye değişkeni olarak kaydedildi, bu yüzden eğer öğeleri eklersem, öğeler de niyetinde olacak. Daha sonra kullanıcı paylaşım öğesini tıkladığında, liste seçilen tüm öğelerle doldurulur. Bunu başarmak için OnShareTargetSelectedListener'u geçersiz kıldım. Bir kullanıcı bir beton paylaşım hedefine (e-posta, dropbox, vb.) Tıkladığında bu yöntem tetiklenir. Sana orada ne yaptığını anlamak umut

private void initSharedActionProvider(MenuItem item) { 
    mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
    mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() { 
     @Override 
     public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 

      //Here is the exportedFiles list populated 
      exportItemsAndSetList(getAllCheckedPositions()); 
      return true; 
     } 
    }); 

    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 

    //exportedFiles is a member Variable which I populate with the selected items, with the exportItemsAndSetList method 
    shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, exportedFiles); 
    shareIntent.setType("application/xml"); 
    mShareActionProvider.setShareIntent(shareIntent); 
} 

:

Şimdi burada bunun için tüm kod (yöntem yalnızca onCreateActionMode bir kez denir) var. Değilse, sormaya çekinmeyin.

Yukarıdakilerin tümü ile, sorunlardan biri çözüldü (simge olarak gösterildiğinde paylaşım simgesinin tıklanabilir olmaması gerekir) - ancak diğer ikisi açık kalır (simgeler o kadar fazla alan ve ilk sorun kullanmaz) . çözüldü ve


Sorun 2 çeşit: Android yüksek çözünürlükte olmak gerçekten yüksek çözünürlük klasörler (hdpi, xhdpi) olan simgeler ihtiyacı olduğu gibi

görünüyor -/devre dışı simgesi yalnızca vardı etkinleştirmek Gözat 32x32 piksel büyüklüğünde bir boyut (ve sadece onları tüm klasörlere koydum) ve bu yüzden Android bir şekilde büyük bir karışıklık yaptı, bu yüzden sadece üç simge eylem çubuğuna sığdı. Tüm simgeleri sildim, ancak orijinali 32x32 pikselde mdpi. Artık Android, 32x32 piksel simgelerini yükseltir ve beş öğeyi hareket çubuğunda görüntüleyebilir. Bu biraz garip.


Sorun çözüldü 1 çeşit:

bu Görünüşe doğrudan ben sorunu 2 çözüldü silme simgesi eylem çubuğu doğrudan yerleştirildi en kısa sürede, sorunun 2 ilgiliydi.

Ayrıca bazı testlerde silme simgesine showAsAction=never eklediğimde metnin her zaman olduğunu gördüm. Gerçekten sorun 2 ile ilgili bir şey olduğunu düşünüyorum (simgeler gerçekten orada kötü şeyler yaptı).


Sorunlarım neredeyse çözüldü.

Şu anda bir (yeni) gerçek hata şimdi aldım: en son kullanılan paylaşım eylemi taşma simgesinin üzerinde yüzüyor. Orada tıklandığında, taşma menüsü hala açar, ama oldukça boktan görünür:

Most recent share icon above overflow icon

nasıl düzeltebilirim ki?

Ben bu **** ile uğraşmaktan vazgeçtim, bu yüzden paylaşım simgesine showAsAction=never ekledim. >

:

Bir ben eskisinden daha iyi bir çözüm biliyorsanız yorum yapmaktan çekinmeyin (Ve evet ... Ben this gördüm, ama aynı zamanda normal yaşam döngüsünün bir başka değişiklik var, bunu yaparsan ben bir istisna olsun)