2014-11-26 3 views
0

У меня есть следующий заказ относительно расположение:Как раздуть пользовательский RelativeLayout программно?

public class CircleView extends RelativeLayout implements OnDragListener { 
    private DropCallback onDrop = null; 
    private ImageButton imageButton = null; 
    private int radius = -1; 
    private double step = -1; 
    private double angle = -1; 
    private static final int CENTER_ID = 111; 

    public CircleView(Context context, DropCallback onDrop, int radius, List<View> views) { 
     super(context); 

     this.onDrop = onDrop; 
     this.radius = radius; 
     this.step = (2 * Math.PI)/views.size(); 

     this.initView(context, views); 
    } 

    private void initView(Context context, List<View> views) { 
     RelativeLayout.LayoutParams layoutParamsView = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 

     this.setLayoutParams(layoutParamsView); 

     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 
     layoutParams.addRule(RelativeLayout.CENTER_VERTICAL); 

     this.imageButton = new ImageButton(context); 
     this.imageButton.setId(CENTER_ID); 
     this.imageButton.setLayoutParams(layoutParams); 
     this.imageButton.setImageResource(R.drawable.ic_power_on); 
     this.imageButton.getBackground().setAlpha(0); 
     this.imageButton.setOnDragListener(this); 

     this.addView(this.imageButton); 

     for(View view : views) { 
      this.addView(this.placeView(view)); 
     } 
    } 

    private View placeView(View view) { 
     view.measure(0, 0); 
     this.imageButton.measure(0, 0); 

     int x = (int)((view.getMeasuredWidth()/2) + this.radius * Math.cos(this.angle)); 
     int y = (int)((view.getMeasuredHeight()/2) + this.radius * Math.sin(this.angle)); 

     this.angle += this.step; 

     int deltaX = view.getMeasuredWidth(); 
     int deltaY = view.getMeasuredHeight(); 
     int deltaImageX = this.imageButton.getMeasuredWidth()/2; 
     int deltaImageY = this.imageButton.getMeasuredHeight()/2; 
     int xToDraw = ((x - deltaX) - deltaImageX); 
     int yToDraw = ((y - deltaY) - deltaImageY); 

     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
     layoutParams.addRule(RelativeLayout.ABOVE, CENTER_ID); 
     layoutParams.addRule(RelativeLayout.RIGHT_OF, CENTER_ID); 
     layoutParams.setMargins(xToDraw, 0, 0, yToDraw); 

     view.setLayoutParams(layoutParams); 

     return view; 
    } 

    @Override 
    public boolean onDrag(View view, DragEvent event) { 
     return this.onDrop.onDrop(view, event); 
    } 
} 

У меня нет файла макета XML для этого, и он работал до сих пор. Сегодня я изменил действие, используя этот настраиваемый макет, который должен быть Fragment, и теперь мне нужно установить макет. К сожалению, что-то вроде следующего не возможно:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 

    return inflater.inflate(new CircleView(this, this, 240, this.views), container, false); 
} 

Так как же я могу раздуть свой собственный относительный макет?

+0

что вам нужно inflater.inflate() для? – pskink

ответ

0

Просто создать экземпляр Круговое и добавить его в контейнер:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    CircleView circleView = new CircleView(this, this, 240, this.views); 
    ... 
    return circleView; 
} 
+0

Если я это сделаю, я получаю: java.lang.RuntimeException: не удается запустить активность ComponentInfo {de.controller.activities.MenuActivity}: java.lang.IllegalStateException: У указанного ребенка уже есть родитель. Сначала вы должны вызвать removeView() родителя ребенка. – Mulgard

+0

@Mulgard, должен ли ваш фрагмент отображать круг или сложный вид с круговым изображением? Я обновляю свой ответ для первого случая. –

+0

только круг – Mulgard

0

Вы должны создать вам макет XML, например circle_view.xml:

<your_package.CircleView android:id="@+id/gcircle_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

, а затем:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 

    return inflater.inflate(R.layout.circle_view, container, false); 
} 

Кстати, вы должны реализовать конструкторы:

public CircleView(Context context){ 
     super(context); 

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

    } 
    public CircleView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 
+0

Я не понимаю этого. где я теперь устанавливаю свой круг? – Mulgard

+0

@Mulgard вместо нового CircleView (это, это, 240, this.views) вам следует использовать сейчас R.layout.circle_view – Suvitruf

+0

Но это и есть точка. Я не хочу его использовать. Я не могу создать круговой макет, подобный этому, используя файл макета xml. – Mulgard

0

Вы можете создайте инфлятор таким образом:

LayoutInflater inflater = LayoutInflater.from(context); 

Затем используйте инфлятор, чтобы надуть необходимый.

Смежные вопросы