2

je posé une autre question et après, je continuais à ce problème ...personnalisé largeur LinearLayout - problème en plaçant le poids

Tout d'abord ma première question: how to Custom Button (has two TextFields) on Android

J'étendu une forme de classe LinearLayout, et ajouter deux boutons dedans (width- fill_parent, weight-1). Mais ils ne peuvent pas placer correctement. Si j'utilise LinearLayout à la place de ma customClass, cela fonctionne correctement. Que devrais-je faire??

Ceci est ma classe

public class SplitButtonController extends LinearLayout 
    implements 
     OnClickListener { 

// Toggle buttons 
private Vector<XButton2> buttons; 

// Listener 
private OnClickListener listener; 

public SplitButtonController(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = layoutInflater.inflate(R.layout.xbutton2, this); 

} 

public SplitButtonController(Context context) { 
    super(context); 
} 

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    init(); 
} 

/** 
* Initialize the toggle buttons (set images and listeners). It's 
* responsibility of the user call this method after he add a ne 
*/ 
public void init() { 
    buttons = new Vector<XButton2>(); 
    addLayoutButtons(); 
    changeButtonsImage(); 
    setListeners(); 
} 
private void addLayoutButtons() { 
    int n = getChildCount(); 
    for (int i = 0; i < n; i++) { 
     View v = getChildAt(i); 
     if (v instanceof XButton2) { 
      buttons.add((XButton2) v); 
     } 
    } 
} 

private void changeButtonsImage() { 
    if (buttons.size() > 1) { 
     buttons.get(0) 
       .setBackgroundResource(
         com.matriksdata.bavul.R.drawable.schedule_left_button_drawable); 

     for (int i = 1; i < buttons.size() - 1; i++) { 
      // buttons.get(i).setBackgroundResource(R.drawable.schedule_left_button_drawable); 
     } 
     buttons.get(buttons.size() - 1) 
       .setBackgroundResource(
         com.matriksdata.bavul.R.drawable.schedule_right_button_drawable); 
    } else { 
     // TODO:set an image with rounded sides 
    } 
} 

private void setListeners() { 
    for (int i = 0; i < buttons.size(); i++) { 
     buttons.get(i).setOnClickListener(this); 
     buttons.get(i).setFocusable(true); 
    } 
} 

@Override 
public void onClick(View v) { 
    for (int i = 0; i < buttons.size(); i++) { 
     XButton2 b = buttons.get(i); 
     b.setChecked(v == b); 
    } 

} 

} 
+0

Comment devrait ressembler le résultat. Qu'est-ce que le pur LinearLayout? Qu'est-ce que votre mise en page personnalisée ne parvient pas à faire? – Knickedi

+0

résultat devrait ressembler, deux boutons remplissent totalement la largeur de l'écran et leur taille est la même. – atasoyh

Répondre

2

Les boutons ajoutés à votre SplitButtonController sont XButton2, et dans votre constructeur, vous gonflez R.layout.xbutton2. Cela provoquera un "XButton2" vide ajouté à votre disposition SplitButtonController. Vous n'avez pas besoin de gonfler quoi que ce soit si vous voulez créer (ou étendre) un simple LinearLayout. Alors votre code SplitButtonController devrait ressembler à ceci:

public class SplitButtonController extends LinearLayout 
    implements 
     OnClickListener { 

// Toggle buttons 
private Vector<XButton2> buttons; 

// Listener 
private OnClickListener listener; 

public SplitButtonController(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    init(); 
} 

/** 
* Initialize the toggle buttons (set images and listeners). It's 
* responsibility of the user call this method after he add a ne 
*/ 
public void init() { 
    buttons = new Vector<XButton2>(); 
    addLayoutButtons(); 
    changeButtonsImage(); 
    setListeners(); 
} 
private void addLayoutButtons() { 
    int n = getChildCount(); 
    for (int i = 0; i < n; i++) { 
     View v = getChildAt(i); 
     if (v instanceof XButton2) { 
      buttons.add((XButton2) v); 
     } 
    } 
} 

private void changeButtonsImage() { 
    if (buttons.size() > 1) { 
     buttons.get(0) 
       .setBackgroundResource(
         com.matriksdata.bavul.R.drawable.schedule_left_button_drawable); 

     for (int i = 1; i < buttons.size() - 1; i++) { 
      // buttons.get(i).setBackgroundResource(R.drawable.schedule_left_button_drawable); 
     } 
     buttons.get(buttons.size() - 1) 
       .setBackgroundResource(
         com.matriksdata.bavul.R.drawable.schedule_right_button_drawable); 
    } else { 
     // TODO:set an image with rounded sides 
    } 
} 

private void setListeners() { 
    for (int i = 0; i < buttons.size(); i++) { 
     buttons.get(i).setOnClickListener(this); 
     buttons.get(i).setFocusable(true); 
    } 
} 

@Override 
public void onClick(View v) { 
    for (int i = 0; i < buttons.size(); i++) { 
     XButton2 b = buttons.get(i); 
     b.setChecked(v == b); 
    } 

} 

} 
+0

ohh ouais ... j'ai eu une grosse erreur. C'est vrai, merci. – atasoyh

Questions connexes