Progressbar в верхней части кнопки в вопросе относительной компоновки в Android Studio

Хорошо, это странно, я надеюсь, что кто-то может объяснить мне.

У меня есть настраиваемый макет кнопки, который создает кнопку с круговой индикацией выполнения в середине кнопки. Ниже приведен мой XML-код. Однако я не могу понять, что ProgressBar кажется, появляется за кнопкой. Если я установил фон кнопки на что-либо, кроме прозрачного, индикатор прогресса не может быть замечен. Когда фон кнопки прозрачен, я могу увидеть ProgressBar но он по-прежнему появляется за текстом кнопки. Я был с пониманием, что взгляды появляются в том порядке, в котором они добавлены. Я даже попытался настроить представление на вершине (view.bringToFront ();), и я попытался удалить представление и воссоздать его.

Почему появляется индикатор прогресса за кнопкой и что я могу сделать, чтобы решить эту проблему?

Большое спасибо

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@android:color/holo_blue_bright" android:padding="2dp"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Button" android:gravity="center" android:textColor="@android:color/white" android:singleLine="true" android:clickable="false"> </Button> <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:layout_centerInParent="true" android:visibility="visible" /> </RelativeLayout> 

Код с использованием вышеуказанной компоновки

  private void setupTableLayout(int NumberOfRows, int NumberOfButtons){ TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT); TableRow.LayoutParams rowParams = new TableRow.LayoutParams(0, android.widget.TableRow.LayoutParams.MATCH_PARENT, 3f); TableLayout tableLayout = (TableLayout) findViewById(R.id.thetablelayout); tableLayout.removeAllViews(); for (int i = 0; i < NumberOfRows; i++) { TableRow tableRow = new TableRow(this); tableRow.setLayoutParams(tableParams); RelativeLayout btnOneLayout = (RelativeLayout)getLayoutInflater().inflate(R.layout.custom_button, null); RelativeLayout btnTwoLayout = (RelativeLayout)getLayoutInflater().inflate(R.layout.custom_button, null); ProgressBar btnOneProgressBar = (ProgressBar)btnOneLayout.findViewById(R.id.progressBar); ProgressBar btnTwoProgressBar = (ProgressBar)btnTwoLayout.findViewById(R.id.progressBar); btnOneLayout.setLayoutParams(rowParams); btnTwoLayout.setLayoutParams(rowParams); Button btnOne = (Button)btnOneLayout.findViewById(R.id.button); btnOne.setText("Btn 1, Row " + i); btnOne.setId(1001 + i); Button btnTwo = (Button)btnTwoLayout.findViewById(R.id.button); btnTwo.setText("Btn 2, Row " + i); btnTwo.setId(2001 + i); setButtonClickListener(btnOneLayout, btnOneProgressBar); setButtonLongClickListener(btnOneLayout, btnOneProgressBar); tableRow.addView(btnOneLayout); //Add layout, instead of just Button View adivider = new View(this); adivider.setLayoutParams(new TableRow.LayoutParams(20, TableRow.LayoutParams.MATCH_PARENT)); adivider.setBackgroundColor(Color.TRANSPARENT); // This bit of code deals with odd/even numbers of buttons. if (((i + 1) * 2) < NumberOfButtons + 1) { tableRow.addView(adivider); tableRow.addView(btnTwoLayout); } else { tableRow.addView(adivider); btnTwoLayout.setBackgroundResource(android.R.color.transparent); tableRow.addView(btnTwoLayout); } tableLayout.addView(tableRow); } } 

Вы можете использовать это на android> = 5.0. В 5.0 они добавили поле высоты для просмотров. Elevation определяет z-порядок просмотров в ViewGroup.

В этом случае кнопка имеет ненулевое значение высоты, а индикатор выполнения имеет нулевое значение.

Установите высоту индикатора выполнения, например 10dp

 <ProgressBar ... android:elevation="10dp"/> 

Попробуйте использовать FrameLayout как это

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@android:color/holo_blue_bright" android:padding="2dp"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Button" android:gravity="center" android:textColor="@android:color/white" android:singleLine="true" android:clickable="false"> </Button> <ProgressBar android:layout_gravity="center" android:id="@+id/progressBar" android:layout_width="40dp" android:layout_height="40dp" android:background="@android:color/transparent" android:layout_centerInParent="true" android:visibility="visible" /> </FrameLayout> 

См. Эту ссылку

Как правило, FrameLayout следует использовать для хранения одного дочернего представления, потому что может быть сложно организовать дочерние представления таким образом, чтобы они были масштабируемы для разных размеров экрана, при этом дети не перекрывали друг друга. Тем не менее, вы можете добавить несколько детей в FrameLayout и управлять своей позицией в FrameLayout, назначив гравитацию каждому ребенку, используя атрибут android: layout_gravity.

Представления для детей рисуются в стеке, причем последний добавленный ребенок сверху.

Добавляя marginTop, вы можете это сделать. В противном случае вы можете изменить структуру кнопки и индикатор выполнения …

  <linearLayout android:orientation="horizontal" ... > <ImageView android:id="@+id/thumbnail" android:layout_weight="0.8" android:layout_width="0dip" android:layout_height="fill_parent" > </ImageView> <TextView android:id="@+id/description" android:layout_marginTop="-20dip" android:layout_weight="0.2" android:layout_width="0dip" android:layout_height="wrap_content" > </TextView> 

Этот код работает отлично для меня: D

Поместите вашу кнопку в другой макет (лучшим вариантом для этого случая является, вероятно, FrameLayout ).

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ... > <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/button" ... /> </FrameLayout> <ProgressBar android:id="@+id/progressBar" ... /> </RelativeLayout> 

Я не могу сказать вам, почему именно вы получаете этот эффект, но я полагаю, что это ошибка. Обратите внимание: если вы замените Button другим видом, например TextView эта проблема не выйдет. Но когда вы меняете RelativeLayout на любой другой (проверенный с помощью FrameLayout ), эта ошибка все же появляется. Я предполагаю, что речь идет об background свойстве и порядке рисования или измерения в любом макете.