2016-04-19 3 views
3

В настоящее время я разрабатываю Android-игру. У меня проблема с содержимым внутри фрагмента. Содержимое отключается, и я не могу найти проблему. Я использую только каталог ресурсов, где я определяю разные макеты. Вот почему я знаю, что проблема кроется в макетах. Сначала я подумал, что это связано с тем, что я использовал android:layout_height="match_parent". Я нашел это решение на StackOverflow, и я надеялся, что это также решит мою проблему. Но это не помогло мне вообще.Содержимое фрагмента отключено

У меня есть activity_game.xml. Там у меня есть местозаполнитель для текущего отображаемого Fragment. Содержание следующее:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="y.trader.com.rhcloud.blackmonster.games.tradery.activity.GameActivity"> 

    <FrameLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

</RelativeLayout> 

Fragment сам имеет следующий макет определен:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal"> 

    <TextView 
    android:id="@+id/money" 
    style="@style/traderY.TextCenter" /> 

    <TextView 
    android:id="@+id/location" 
    style="@style/traderY.TextCenter" /> 

    <ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/junkie_icon"/> 

    <ListView 
    android:id="@+id/drug_list" 
    style="@style/traderY.List" /> 

    <TableRow 
    style="@style/traderY.ButtonRow"> 

    <Button 
     android:id="@+id/sell_drugs" 
     style="@style/traderY.ButtonCenter" 
     android:text="@string/sell"/> 

    <Button 
     android:id="@+id/nothing" 
     style="@style/traderY.ButtonCenter" 
     android:text="@string/nothing"/> 

    </TableRow> 

</LinearLayout> 

А вот захваченный экран, чтобы показать проблему.

Screen capture

Как вы можете видеть, последние две кнопки порезов. Я хотел бы избежать этого и, скорее, позволить пользователю прокручивать вниз. Я в мертвой ситуации, и я был бы признателен за любую помощь. И я надеюсь, что мне удастся объяснить проблему достаточно хорошо, чтобы ее можно было понять.

ответ

1

Без использования ScrollView, вы можете установить weight для ListView , Попробуйте это решение:

<ListView 
    ... 
    android:layout_weight="1"/> 
+0

Я попробую, потому что 'ScrollView' не сделал этого трюка. –

+0

Извините, я обновил свой ответ. 'ListView' вместо' TableRow' –

+0

ОК, я использовал это, и теперь у 'ListView' есть свиток. И таким образом контент полностью отображается. Я хотел прокрутить весь контент, но это решение также достаточно хорошо. Благодаря! –

0

Вы должны обернуть макет фрагмента в Scrollview, чтобы включить прокрутку:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true"> 

<!-- your layout here --> 

</ScrollView> 

Вы можете увидеть пример этого используется здесь: Android ScrollView Example

+0

Я сразу же попробую. Должен ли я сделать это внутри «LinearLayout» макета фрагмента или вы бы рекомендовали заменить «LinearLayout» на 'ScrollView'? –

+0

ОК, я думаю, что получаю ваше решение. Я должен разместить 'LinearLayout' внутри' ScrollView'. –

+0

Да, как правило, вы бы разместили 'LinearLayout' внутри' ScrollView' – Simon

0

вы должны сделать свою родительскую высоту контейнера для match_parent

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="y.trader.com.rhcloud.blackmonster.games.tradery.activity.GameActivity"> 

    <FrameLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

</RelativeLayout> 
+0

Это не поможет. Я уже пробовал это, прежде чем я открыл здесь вопрос. Спасибо, в любом случае. –

0

Я хотел бы избежать оборачивать весь макет в ScrollView, потому что она содержит ListView и вложенный скроллинг мнение следует избегать , Вместо этого, если вы хотите, чтобы кнопки отображались в нижней части списка, вы можете сделать их последним элементом списка в ListView. Для этого вам придется переопределить getItemViewType(int position) и getViewTypeCount().

Другим решением было бы разместить кнопки поверх ListView, поставив ListView и TableView в RelativeLayout, а затем объявив TableView последним.

0

Если ваш макет уже содержит список, а затем применяется родительский макет, поскольку scrollview не является хорошей практикой. однако, если вы все еще хотите его использовать, вы можете установить высоту списка в динамическом режиме, чтобы все его элементы были видны без прокрутки. Вы можете достичь этого, используя этот небольшой код

public static void setListViewHeightBasedOnChildren(final ListView listView) { 
      listView.post(new Runnable() { 
       @Override 
       public void run() { 
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) { 
         return; 
        } 
        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom(); 
        int listWidth = listView.getMeasuredWidth(); 
      for (int i = 0; i < listAdapter.getCount(); i++) { 
         View listItem = listAdapter.getView(i, null, listView); 
         listItem.measure(
           View.MeasureSpec.makeMeasureSpec(listWidth, View.MeasureSpec.EXACTLY), 
         View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 


         totalHeight += listItem.getMeasuredHeight(); 
         Log.d("listItemHeight " + listItem.getMeasuredHeight(), "********"); 
        } 

        Log.d("totalHeight " + totalHeight, "********"); 

        ViewGroup.LayoutParams params = listView.getLayoutParams(); 
        params.height = (int) ((totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)))); 
        listView.setLayoutParams(params); 
        listView.requestLayout(); 

       } 
      }); 
     } 

просто передать свой ListView Id этому методу, и он будет установить высоту ListView динамически для вас. а затем вы можете использовать scrollview без каких-либо проблем и прокручивать весь контент в соответствии с вашими потребностями.

использование:

ListView yourListView = (ListView) findViewById(R.id.your_list_view); 

    YourListViewAdapter adapter = new YourListViewAdapter(); 

    yourListView.setAdapter(adapter); 

    //set height here 
    setListViewHeightBasedOnChildren(yourListView); 

Надеется, что это помогает. Happy Coding :)