2013-10-11 3 views
0

Я реализую фрагмент для просмотра расписания. Каждое из этих событий анализируется из формата API календаря Google. Для удобства использования (люди будут использовать это приложение, которые не являются частью нашей организации, поэтому у них не будет доступа для чтения/записи к календарю), я пытаюсь испечь просмотрщик календаря Google в этом приложении (вы будете обратите внимание, что это стилизовано очень похожим образом).Проблемы при добавлении LinearLayout в RelativeLayout

Ниже приведен пример структуры события: event structure
Событие состоит из двух TextViews (название и описание), разнесенных друг от друга, 5 диоптрий, которые содержатся в вертикально ориентированной LinearLayout. RelativeLayout - это корневой контейнер в этом макете.

Мой вопрос: Эти события разнесены в нужном месте, используя свои margin:top значения. margin:left должен быть 55dp, чтобы избежать совпадения с метками времени с левой стороны. Я упоминаю об этом, потому что интервал является ключевым для правильной работы этой реализации, поэтому мне нужно сохранить это любой ценой. Это кажется возможным, используя LinearLayout.LayoutParams, но, пожалуйста, исправьте меня, если я ошибаюсь.

Однако, прежде чем я доберусь туда, я не могу даже получить событие для отображения. Моя информация о событии корректно анализируется, расчеты выполняются правильно (проверено по статусу журнала), кажется, создается LinearLayout. Однако, когда я просматриваю расписание, я могу видеть только маркеры времени и линии сетки. Нет событий.

Ниже приведен код, я использую, чтобы построить LinearLayout и присоединить его к своему корневому RelativeLayout:

private void addShow(String title, String description, int startTime, int endTime) { 

    /* Build the LinearLayout to function as the container for this show. Since the size of the container is to represent 
    the length of the show, its height must be proportional (1dp = 1 minute) to the length. Determine length by finding the difference 
    between the start and end times. */ 
    int difference = endTime - startTime; 

    /* Define the margins of this show. All shows must not overlap the displayed times, which are 50dp in width. 
    Add 5 more (to the right and left) to see the schedule lines for clarity. Push the show down to align with the appropriate time marker using the top margin value set to the 
    difference (in minutes) between midnight and the start of the show. */ 
    RelativeLayout.LayoutParams rlLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dpToPixels(difference)); 
    rlLayoutParams.setMargins(dpToPixels(55), dpToPixels(startTime), dpToPixels(5), 0); // l, t, r, b 

    /* Build LinearLayout and apply parameters */ 
    LinearLayout eventLL = new LinearLayout(getActivity()); 
    eventLL.setOrientation(LinearLayout.VERTICAL); 
    eventLL.setPadding(dpToPixels(5), dpToPixels(5), dpToPixels(5), dpToPixels(5)); 
    eventLL.setBackgroundResource(R.drawable.orange_rounded_event); 
    eventLL.setLayoutParams(rlLayoutParams); 

    /* Add title of event to LinearLayout */ 
    TextView titleTV = new TextView(getActivity()); 
    titleTV.setText(title); 
    eventLL.addView(titleTV); 

    /* Determine length of event to see if we have room to attach a description (if one was passed) */ 
    int length = endTime - startTime; 
    if (length >= 60 && description != null) { 
     TextView descriptionTV = new TextView(getActivity()); 
     descriptionTV.setText(description); 
     eventLL.addView(descriptionTV); 
    } 

    /* Add this view to the schedule UI */ 
    RelativeLayout rl = (RelativeLayout)getActivity().findViewById(R.id.schedule_container_relativelayout); 
    rl.addView(eventLL); 
} 

И только в случае, если это может быть завинчивания что-то, вот дп методу рх I» м, используя, что я нашел здесь, на StackOverflow:

/** 
* Converts dp values to an appropriate amount of pixels based on screen density of this device. 
* @param dp value of dp to convert 
* @return equivalent pixel count 
*/ 
private int dpToPixels(int dp) { 
    Resources r = getActivity().getResources(); 
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()); 
} 

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

ответ

1

Для всех, кто может столкнуться с этим вопросом из поисковой системы, я нашел исправление.

По какой-то причине он работал, когда я определял поля, используя общедоступные методы из RelativeLayout.LayoutParams членов напрямую.

RelativeLayout.LayoutParams rrLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, dpToPixels(difference)); 
rrLayoutParams.leftMargin = dpToPixels(55); 
rrLayoutParams.topMargin = dpToPixels(startTime); 
rrLayoutParams.rightMargin = dpToPixels(5); 

И я должен был передать параметры в addView()

rl.addView(eventLL, rrLayoutParams); 
Смежные вопросы