2013-04-24 24 views
10

コンテキストアクションバーには奇妙な動作があります。コンテキストメニューバーの奇妙な動作

まず:

1つのメニュー項目は、私だけがオーバーフローボタンをクリックして毎秒の時間を示している:

第二/第三

Clicking behavior overflow button of CAB

は、そのアイコン方法はありますあまりにも多くのスペースを使用しないでください?私はすべての項目にプロパティandroid:showAsAction="always"を追加変更

は、すべてのアイコンを表示するために、実際に十分なスペースがある - けどを私の共有アイコンはもうクリックできない:

All Items with showAsAction always

クリーンプロジェクトはしていません助けて。

私のテストデバイス(Galaxy S3)でAndroid 4.2.2を使用しています。

は私も(また、一番下にnavigationbarを取り出し、 SlimBean前に、今 CyanogenMod 10.1)完全に私 XXX GS3に新しいROMをフラッシュしようとした - 助けにはなりませんでした。

Nexus 4でも試しました。スペースが増えるので、共有ボタンと削除ボタンが表示されます。共有ボタンは、アクションモードを開始するとのクリック可能ではありませんが、デバイスを横長モードにすると機能し、ポートレートに戻すと機能します。 Nexus 4では基本的に共有ボタンが回転する前に機能しません。


マニフェスト:minSdkVersion=17に対してコンパイル

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

には違いはありません。

私はこのようなフラグメントからのアクション・モードを開始します。私はメニューを移入ActionMode.Callback

mActionMode = activity.startActionMode(mMultipleCallback); 

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

そして、ここではXMLです:

<?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> 

完全を期すために、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

デバイスでv14を使用しているか、v14 SDKに対してコンパイルしていますか? –

+0

なぜ下の投票??とにかく私のデバイスで4.2.2を使用しています - 明確化のために編集を確認してください –

+0

これは私ではありませんでした。あなたがv14に対してコンパイルすれば、私は最初に最新のSDKをコンパイルしようとします。 –

答えて

9

いいえ、共有できない共有アイコンの解決策です。これは私からAPIへの誤解のようなものでした。

SharedActionProvider-Itemは、メニューXMLファイルの他のすべての項目と同様に扱えると思いました。しかし、実際にはできません。 onActionItemClickedは、アクションとして表示されているときにこのアイコンに対しても起動されません(showAsAction=alwaysを追加したときにクリックできない理由です)。面白いことに、アイコンが表示されていないときにクリックイベントがトリガーされますが、オーバーフローメニューに表示されます。 これはコンテキストアクションバーの実際のバグかもしれません!

今、私は最終的にあなたがSharedActionProvider-Itemをトリガーする方法を考え出し:

あなたがする必要があるonCreateActionMode方法でIntentを入れて(!):今、あなたは言うかもしれ

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

:「あなたは馬鹿これは明白であり、以前のようにonActionItemClickedメソッドのように常にその目的を常に設定する方が良いです。

申し訳ありませんが、私は同意しません。ここに設定するのは本当に意味がありません。理由は:私にとっては、あなたがチェックしたすべての追加項目ごとに意図が変わります。これはチェックするアイテムごとにエクスポートXMLファイルを作成します。アイコンをクリックするたびにXMLファイルを作成したくありません。これは意味をなさないし、ユーザーが本当にアイテムをエクスポートしたいときにのみ、すべてのXMLファイルを作成したい。

基本的に私はこれを回避する方法をとった。最初はIntentを作成し、空白を追加しますList<Uri>。このリストは私のクラスのメンバ変数として保存されるので、アイテムを追加すると、そのアイテムもインテントになります。ユーザーが共有アイテムをクリックすると、選択したすべてのアイテムがリストに表示されます。これを達成するために私はOnShareTargetSelectedListenerを打ち消した。このメソッドは、ユーザーが具体的な共有ターゲット(メール、Dropboxなど)をクリックしたときにトリガーされます。私はあなたが私がやったことを理解してほしい

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

は今ここにそのためのコード全体(メソッドだけonCreateActionModeから一度と呼ばれている)があります。そうでない場合は、お気軽にお問い合わせください。

私の問題の1つは解決されています(共有アイコンはアイコンとして表示されてもクリックできません)が、残りの2つは開いたままです(アイコンはあまりにも多くのスペースと最初の問題を使いません) 。解決の


問題2種類:Androidは本当に高解像度であることをより高解像度のフォルダ(hdpi、xhdpi)にあるアイコンを必要とするよう

はそう - 私の有効/無効のアイコンが唯一持っていました32x32ピクセルのサイズ(と私はちょうどすべてのフォルダに入れている)ので、アンドロイドは何とか大きな混乱を起こしたので、3つのアイコンがアクションバーに収まりました。私はすべてのアイコンを削除しましたが、元のアイコンは32x32ピクセルでmdpiです。 Androidは32x32ピクセルのアイコンをアップスケールし、アクションバーに5つのアイテムを表示できます。それは奇妙なことです。


解決の問題1種類:

これが問題2に直接関連していたように見える、とすぐに私は、問題2を解決して、削除アイコンは、アクションバーの上に直接置きました。

また、いくつかのテストで、削除アイコンにshowAsAction=neverを追加した場合、テキストが常に存在することがわかりました。私は本当にそれが問題2と関係があると思う(アイコンは本当に悪いことをした)。


私の問題はほぼ解決されています。

(新規)実際のバグ:最近使用された共有アクションがオーバーフローアイコン上に浮いています。そこをクリックすると、オーバーフローメニューはまだ開きますが、それはかなりくだらないなります

Most recent share icon above overflow icon

私はこれをどのように問題を解決しましたか?

私はこの****を使いこなしているので、共有アイコンにshowAsAction=neverを追加しました。 >

あなたは、私が使用されるよりもよりよい解決策を知っていればコメントをお気軽に(そして、はい...私はthisを見ましたが、私はまた、それが通常のライフサイクルの別の変更があります、これを行う場合、私は例外を取得します)