2013-02-19 10 views
20

0 Sto usando startActionMode (ActionMode) sulla mia app.Rimuovi il pulsante "Fine" di ActionMode

Per impostazione predefinita è aggiungere un pulsante "Fatto" sulla barra, voglio rimuoverlo.

Inoltre, se c'è un modo per cambiare il suo testo, voglio saperlo, perché una descrizione diversa da "Fatto" può rendere l'azione corrispondente al comportamento di ciò che fa.

+0

Fornire un'immagine rende più chiaro di cosa si sta parlando. – JoxTraex

+2

IMHO, quello che vuoi è un disegno non valido. Per definizione, l'utente può chiudere la modalità di azione, ad esempio premendo il pulsante INDIETRO. Una modalità di azione dovrebbe essere non distruttiva per impostazione predefinita: l'attivazione di una modalità di azione, quindi premendo INDIETRO (o toccando Fine) non dovrebbe causare modifiche ai dati dell'utente. – CommonsWare

+0

Hmm .. questo è anche vero. Quindi c'è un modo per cambiarlo in modo che l'utente non venga confuso? Perché a volte "Annulla" è una descrizione migliore di "Fatto". Ty! –

risposta

1

Anche sono rimasto bloccato con la stessa e ho trovato questo modo per risolverlo.

int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android"); 
LinearLayout layout = (LinearLayout) findViewById(doneButtonId); 
TextView doneview = (TextView) layout.getChildAt(1); 
doneview.setText(""); 

Spero che questo aiuti !!

+10

Questa è una soluzione inaffidabile, in quanto assume i dettagli dell'implementazione soggetti a modifiche. – CommonsWare

+1

non funziona ho provato questo sto ricevendo eccezione puntatore nullo, quando dovrei chiamare questo metodo, sto usando frammento –

+0

Funziona perfettamente nel caso in cui si utilizza un dispositivo tablet – MohammadReza

43

Sono d'accordo con @CommonsWare che è un disegno non valido per nascondere il pulsante Fine .

Tuttavia, ci sono clienti che vogliono rimuovere questo pulsante e posso capire che il segno di spunta potrebbe causare confusione agli utenti perché in realtà non fa nulla in alcuni casi.

Quindi, ecco come rimuovere il pulsante con stili:

<style name="AppTheme" parent="android:Theme.Holo"> 
    <item name="android:actionModeCloseButtonStyle">@style/NoCloseButton</item> 
</style> 

<style name="NoCloseButton" parent="@android:style/Widget.ActionButton.CloseMode"> 
    <item name="android:visibility">gone</item> 
</style> 
+1

non funziona per me! È valido come di ICS? – rupps

+0

Ottima soluzione per API 11+ ma esiste un modo per farlo in API 8+?Io uso ActionBarSherlok c'è un modo per nasconderlo? ActionModeCloseButtonStyle richiede API 11+ – Cilenco

+3

@Cilenco: 'actionModeCloseButtonStyle' (senza' android: ') dovrebbe funzionare per ABS. –

2

Se si utilizza ActionBarSherlock è possibile nascondere il pulsante "Done" con questo stile:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style name="NoCloseButton" parent="@style/Widget.Sherlock.ActionButton.CloseMode"> 
     <item name="android:visibility">gone</item> 
    </style> 

    <style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar"> 
     <item name="actionModeCloseButtonStyle">@style/NoCloseButton</item> 
    </style> 

    <!-- Application theme. --> 
    <style name="AppTheme" parent="AppBaseTheme"> 

    </style> 
</resources> 

Assicurarsi per mettere questo stile in ogni directory di stile (valori, valore-v11, valori-v14). Dopo di che è possibile creare un menu personalizzato con questo codice:

LayoutInflater inflater = LayoutInflater.from(getSherlockActivity()); 
View actionView = inflater.inflate(R.layout.actionmode, null); 

ActionMode am = getSherlockActivity().startActionMode(mActionModeCallback); 
am.setCustomView(actionView); 
+1

Ma qui actionView non occupa l'intera larghezza dello schermo. – sandeepmaaram

+1

Sì. Ma qui actionView non occupa l'intera larghezza dello schermo –

+0

, nessuno trova la soluzione per la larghezza dello schermo? –

1

Grazie per Matthias Robbers, funziona. Ma mi permetto di usare "invisibile":

<style name="NoCloseButtonActionModeStyle"> 
    <item name="android:visibility">invisible</item> 
</style> 

Quindi la posizione della vista personalizzata in ActionMode non indenterà alla parent sinistra.

0

qualcuno trova la soluzione di larghezza dello schermo? - Mayur R. Amipara 5 giugno 15 alle 10:27

ha la precedenza sulla vista personalizzata suMisura, imposta la larghezza su larghezza dello schermo. e in onLayout, ritrasmettere le viste del bambino.

funziona per me.

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.view.View; 
import android.widget.RelativeLayout; 

import com.android.gallery3d.R; 

public class SelectActionModeCustomView extends RelativeLayout { 

    private View mLeftButton; 
    private View mRightButton; 

    private int mScreenWidth; 

    private static final String TAG = "SelectActionView"; 

    public SelectActionModeCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
     mScreenWidth = metrics.widthPixels; 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     mLeftButton = findViewById(R.id.cancel); 
     mRightButton = findViewById(R.id.select_action); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     this.setMeasuredDimension(mScreenWidth, this.getMeasuredHeight()); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 
     int childLeft = 0; 
     int childTop = 0; 

     childLeft = 0; 
     childTop = ((b - t) - mLeftButton.getMeasuredHeight())/2; 
     mLeftButton.layout(childLeft, childTop, 
       childLeft + mLeftButton.getMeasuredWidth(), 
       childTop + mLeftButton.getMeasuredHeight()); 

     childLeft = (r - l) - mRightButton.getMeasuredWidth(); 
     childTop = ((b - t) - mRightButton.getMeasuredHeight())/2; 
     mRightButton.layout(childLeft, childTop, 
       childLeft + mRightButton.getMeasuredWidth(), 
       childTop + mRightButton.getMeasuredHeight()); 
    } 


} 
Problemi correlati