75

बनाने के दौरान नहीं बुलाया गया है, मैंने अपने ऐप्स में से एक को नए v22.1.1 समर्थन & एपकोम्पेट लाइब्रेरीज़ में समायोजित करना समाप्त कर दिया है, अधिक जानकारी के लिए here और here देखें। जब मैंने कुछ परीक्षण किया, तो मैं उपयोग कर रहा हूं ActionModes के साथ कुछ बंद था।ऑनपेरेअरेक्शन मोड को एक्शनमोड

जब आप एक ActionMode शुरू एक startSupportActionMode() कॉल का उपयोग कर - onPrepareActionMode() नहीं बुलाया जा रहा है - अगर आप अब पदावनत ActionBarActivity आधार वर्ग या नए AppCompatActivity आधार वर्ग का उपयोग यह कोई बात नहीं।

v21.0.3 & v22.0.0 सहित पिछले संस्करणों, में, onPrepareActionMode(), स्वचालित रूप से बुलाया गया था जब ActionMode शुरू में startSupportActionMode() का उपयोग कर बनाया गया था।

मैं एक 2.2, 4.4.2 और 5.0 डिवाइस पर परीक्षण किया, तो यह संस्करण निर्भर होने के लिए नहीं लगता है।

किसी को भी पता है, अगर इस व्यवहार करना है, कि v22.1.1 या किसी बग में शुरू किया गया है?

मैं इस issue पाया है, लेकिन वहाँ प्रतिक्रिया यहाँ का एक बहुत ...

संपादित कर सकते हैं 11 2015 नहीं है:

Android issue tracker 159527 में उल्लेख किया है, इस मुद्दे को न केवल v22.1 को प्रभावित करता है एपकंपेट और समर्थन लाइब्रेरी का .x, लेकिन 5.1 एंड्रॉइड कार्यान्वयन भी।

दो पल में संभव अस्थायी समाधान, एक सामान्य से एक:

@Override 
public ActionMode startSupportActionMode(final ActionMode.Callback callback) { 
    // Fix for bug https://code.google.com/p/android/issues/detail?id=159527 
    final ActionMode mode = super.startSupportActionMode(callback); 
    if (mode != null) { 
    mode.invalidate(); 
    } 
    return mode; 
} 

और एक 'त्वरित और गंदी' एक (यदि आप अपने ActionMode का दृष्टांत जब):

final ActionMode actionMode = startSupportActionMode(new MyActionMode()); 
if(actionMode != null) { 
    actionMode.invalidate(); 
} 

यदि आप डॉन ' एपकोपेट का उपयोग नहीं करें (ActionBarActivity/AppCompatActivity) आपको startSupportActionMode()startActionMode() के साथ प्रतिस्थापित करने की आवश्यकता है।

दुर्भाग्यवश यह अभी भी स्पष्ट नहीं है कि यह नया व्यवहार या बग का इरादा है या नहीं। API doc के अनुसार यह एक बग/प्रतिगमन है, लेकिन कौन जानता है ...

+0

मैं आपसे सहमत हूँ - यह एक बग है। मैं बस इसमें भाग गया और कुछ समय बिताया कि यह पता लगाने के लिए कि ऑनपेर ... अब और नहीं कहा जाता है। मेरे मामले में, मुझे लगता है कि यह बस मेरे सभी ऑनपेयर को बंद करने के लिए काम करेगा ... कोड को चालू करें ... –

+9

@ डार्कासगा: आपको अपने संपादन को एक जवाब में बदलना चाहिए और इसे स्वीकार करना चाहिए :) –

उत्तर

1

मैं एक डेमो बनाया है और उसके काम कर ठीक, onPrepareActionMode हर बार कार्रवाई मोड में दिखाया गया है कहा जाता हो जाता है। हमेशा CreateActionMode पर कॉल किया जाता है, लेकिन मोड को अमान्य होने पर कई बार बुलाया जा सकता है। [ मैं किसी को भी एक छोटा संपादन करने का अनुरोध करता हूं। मुझे टूलबार के समान स्टेटस बार रंग की आवश्यकता है लेकिन गतिशील रूप से, आप देख सकते हैं कि अनावश्यक ड्रायर लेआउट का उपयोग इस प्रभाव को प्राप्त करने के लिए किया जाता है, लेकिन अगर मैं ड्रायर लेआउट को हटा देता हूं तो स्टेटस बार रंग टूलबार रंग के अनुसार नहीं बदलता है। उपयोगिता में आप डिफॉल्ट डिफ़ॉल्ट थीम रंग लाल रंग से देख सकते हैं, टूलबार को धीरे-धीरे लाल रंग मिलता है लेकिन स्टेटस बार नहीं, केवल तभी होता है जब मैं ड्रायर लेआउट को हटा देता हूं। मुझे शैली का उपयोग करके ऐसा करने की ज़रूरत है। ] एक संसाधन लेआउट और यह नाम बनाएँ => action_mode_activity

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/my_drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      android:orientation="vertical" 
      app:insetForeground="#4000"> 

      <include 
       android:id="@+id/toolbar" 
       layout="@layout/toolbar" /> 

      <EditText 
       android:id="@+id/editTextCopy" 
       android:layout_width="fill_parent" 
       android:layout_height="40dp" 
       android:layout_marginTop="19dp" 
       android:ems="10" 
       android:inputType="textMultiLine" 
       android:text="Long click to share!"> 

       <requestFocus /> 
      </EditText> 
     </LinearLayout> 

</android.support.v4.widget.DrawerLayout> 

एक गतिविधि नाम यह ActionModeActivity बनाएं

import android.os.Build; 
import android.os.Bundle; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.ActionMode; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.example.deepakpawar.demolearning.R; 
import com.example.deepakpawar.demolearning.demo.load.recycler.Utils; 

/** 
* Created by Deepak Pawar on 9/24/2015. 
*/ 
public class ActionModeActivity extends AppCompatActivity implements View.OnLongClickListener, ActionMode.Callback { 

    EditText editTextCopy; 
    android.view.ActionMode mActionMode; 
    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Utils.onActivityCreateSetTheme(this); 
     setContentView(R.layout.action_mode_activity); 

     // 1. Get the editText 
     editTextCopy = (EditText) findViewById(R.id.editTextCopy); 

     // 2. add long-click listener 
     editTextCopy.setOnLongClickListener(this); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
      ActionBar actionBar = getSupportActionBar(); 
      actionBar.setDisplayHomeAsUpEnabled(true); 
      actionBar.setHomeButtonEnabled(true); 
      actionBar.setTitle("Android Students"); 
     } 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

      getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
     } 
    } 

    @Override 
    public boolean onLongClick(View view) { 

     // if actionmode is null "not started" 
     if (mActionMode != null) { 
      return false; 
     } 
     // Start the CAB 
     mActionMode = this.startActionMode(this); 
     view.setSelected(true); 
     return true; 

    } 

    // 4. Called when the action mode is created; startActionMode() was called 
    @Override 
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) { 

     // Inflate a menu resource providing context menu items 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.action_menu, menu); 
     return true; 
    } 

    // 5. Called when the user click share item 
    @Override 
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_share: 
       Toast.makeText(this, "Shared!", Toast.LENGTH_SHORT).show(); 

       mode.finish(); // Action picked, so close the CAB 
       return true; 
      default: 
       return false; 
     } 
    } 

    // 6. Called each time the action mode is shown. Always called after onCreateActionMode, but 
    // may be called multiple times if the mode is invalidated. 
    @Override 
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) { 

     Toast.makeText(ActionModeActivity.this,"onPrepareActionMode Called ",Toast.LENGTH_SHORT).show(); 
     return false; // Return false if nothing is done 
    } 

    // 7. Called when the user exits the action mode 
    @Override 
    public void onDestroyActionMode(android.view.ActionMode mode) { 
     mActionMode = null; 
    } 
} 

// Utils वर्ग विषय बदलने के लिए विधि होने // मैं इसे बनाया है क्योंकि ऐप थीम को गतिशील रूप से बदलने की आवश्यकता आयात android.app.Activity;

public class Utils { 
    private static int sTheme; 
    public final static int THEME_DEFAULT = 0; 
    public final static int THEME_WHITE = 1; 
    public final static int THEME_BLUE = 2; 

    /** 
    * Set the theme of the Activity, and restart it by creating a new Activity of the same type. 
    */ 

    public static int getsTheme() { 
     return sTheme; 
    } 

    public static void changeToTheme(Activity activity, int theme) { 
     sTheme = theme; 
     activity.recreate(); 
//  activity.finish(); 
//  activity.startActivity(new Intent(activity, activity.getClass())); 
    } 

    /** 
    * Set the theme of the activity, according to the configuration. 
    */ 
    public static void onActivityCreateSetTheme(Activity activity) { 
     switch (sTheme) { 
      default: 
      case THEME_DEFAULT: 
       activity.setTheme(R.style.FirstTheme); 
       break; 
      case THEME_WHITE: 
       activity.setTheme(R.style.SecondTheme); 
       break; 
      case THEME_BLUE: 
       activity.setTheme(R.style.Thirdheme); 
       break; 
     } 
    } 
} 

V21-themes.xml

<resources> 

    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:windowContentTransitions">true</item> 
     <item name="android:windowAllowEnterTransitionOverlap">true</item> 
     <item name="android:windowAllowReturnTransitionOverlap">true</item> 
     <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
     <item name="android:windowSharedElementExitTransition">@android:transition/move</item> 

     <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
     <!-- <item name="android:navigationBarColor">@color/PrimaryColor</item>--> 

     <item name="windowActionBar">false</item> 
     <item name="windowActionModeOverlay">true</item> 

     <!-- To Make Navigation Drawer Fill Status Bar and become Transparent Too --> 
     <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
     <item name="android:statusBarColor">@android:color/transparent</item> 


<!--//if darker status bar needed--> 
     <!-- <item name="android:windowTranslucentStatus">true</item>--> 
    </style> 


    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> 
     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/PrimaryColor</item> 
     <item name="colorPrimaryDark">@color/PrimaryDarkColor</item> 
     <item name="colorAccent">@color/AccentColor</item> 
     <item name="android:textColorPrimary">@color/TextPrimaryColor</item> 
     <item name="android:windowBackground">@color/WindowBackground</item> 
    </style> 

    <style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
     <item name="android:contentDescription">@string/accessibility_overflow</item> 
    </style> 


    <!-- style for the tool bar backgrounds --> 
    <style name="ToolBarStyle" parent="ToolBarStyle.Base" /> 

    <style name="ToolBarStyle.Base" parent=""> 
     <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item> 
     <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item> 
    </style> 

    <style name="ToolBarStyle.Event" parent="ToolBarStyle"> 
     <item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item> 
    </style> 

    <style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> 
     <!--Any text styling can be done here--> 
     <item name="android:textStyle">normal</item> 
     <item name="android:textSize">18sp</item> 
     <item name="android:textColor">#000000</item> 
    </style> 

    <!-- Customize your theme example here. --> 

    <style name="FirstTheme"> 
     <item name="android:textColor">#FF0000</item> 
     <item name="colorPrimary">#FF0000</item> 
     <item name="colorPrimaryDark">#ff0000</item> 
     <item name="colorAccent">#ff0087</item> 
     <item name="android:shadowColor">#00ccff</item> 
     <item name="android:shadowRadius">1.5</item> 
     <item name="android:shadowDy">1</item> 
    </style> 

    <style name="SecondTheme"> 
     <item name="android:textColor">#00FF00</item> 
     <item name="colorPrimary">#00FF00</item> 
     <item name="colorPrimaryDark">#00FF00</item> 
     <item name="colorAccent">#00FF90</item> 
     <item name="android:shadowColor">#00ccff</item> 
     <item name="android:shadowRadius">1.5</item> 
     <item name="android:shadowDy">1</item> 
    </style> 

    <style name="Thirdheme"> 
     <item name="android:textColor">#0000F0</item> 
     <item name="colorPrimary">#0000F0</item> 
     <item name="colorPrimaryDark">#0000F0</item> 
     <item name="colorAccent">#0090F0</item> 
     <item name="android:shadowColor">#00ccff</item> 
     <item name="android:shadowRadius">1.5</item> 
     <item name="android:shadowDy">1</item> 
    </style> 


    <style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> 
     <item name="colorAccent">#FFCC00</item> 
     <item name="android:textColorPrimary">#FFFFFF</item> 
     <item name="android:background">#5fa3d0</item> 
    </style> 

</resources> 
0

मैं एक ऐसी ही समस्या थी।

बिल्ड Igradle के "compileSdkVersion" और "buildToolsVersion" के मान को बढ़ाने के बाद, मुझे पता चला कि ऑनपेरएक्शन मोड को नहीं कहा गया था।

  • compileSdkVersion: 21 से 26 करने के लिए
  • buildToolsVersion: 21.1.2 26.0.2 के लिए

तो मैं करने के लिए (ए) से मेरे कोड (बी) ले जाया गया। (कृपया नीचे देखें)

मुझे यकीन है कि नहीं कर रहा हूँ अगर यह सही समाधान है, लेकिन यह काम करता है।

यहां मेरे कोड का अंश है।

list1 = findViewById(R.id.listView1); 

list1.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     //(A) 
     //MenuItem menuItem1 = menu.findItem(R.id.menu_item1); 
     //menuItem1.setVisible(false); 
     return false; 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_action_mode, menu); 

     //(B) 
     MenuItem menuItem1 = menu.findItem(R.id.menu_item1); 
     menuItem1.setVisible(false); 

     return true; 
    } 
संबंधित मुद्दे