2015-01-08 3 views
1

저는 Android에 익숙하지 않아 몇 주 동안 앱을 만들고 있습니다.android -보기가 "GONE"으로 설정되면 그 아래보기가 보이지 않게됩니다.

제목에서 말하듯이 문제는 프로그래밍 방식으로 Spinner을 GONE으로 설정하려고 할 때 이 그 아래에있는 경우 RelativeLayout도 사라졌습니다. 여기

은 XML입니다 :

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

    <Spinner 
     android:id="@+id/tableSelector" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 


    <ListView 
     android:id="@+id/insertList" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/tableSelector" 
     android:layout_above="@+id/saveButton" 
     android:background="#aaffffff" 
     android:divider="#11000000" 
     android:dividerHeight="4dp" 
     android:visibility="gone" > 

    </ListView> 

    <Button 
     android:id="@+id/saveButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:text="@string/button_save" 
     android:visibility="visible" /> 

</RelativeLayout> 

그리고 여기가 프로그래밍 방식으로 설정하는 방법입니다

switch(spinnerFlag) 
{ 
    case SPINNER_HIDDEN: tableSelector.setVisibility(View.GONE); break; 
    case SPINNER_VISIBLE: tableSelector.setVisibility(View.VISIBLE); break; 
    case SPINNER_VISIBLE_DISABLED: tableSelector.setVisibility(View.VISIBLE); 
             tableSelector.setEnabled(false); 
             break; 
    default: Log.d("onActivityCreated - InserFragment", "Spinner flag < " + spinnerFlag + " > does not exist. Spinner is now visible enabled."); 
} 

또한 SPINNER_HIDDENListView로 설정하면이 경우 SPINNER_VISIBLESPINNER_VISIBLE_DISABLED을 위해 잘 작동하지만 사라진다. 싸이 오리와 응우 엔 도안 퉁으로

업데이트] 내가 ListViewlayout_alignWithParentIfMissing 속성을 추가 제안했다. 그러나 나는 그것이 아직도 작동하지 않았다는 것을 알아 차렸다. xml에 ListView의 표시 여부를 visible으로 설정했는데 표시되지만 비어 있습니다. 그래서 문제가 해결되었지만 ListView가 비어있는 또 다른 문제가 생겼습니다. ((spinnerFlag == SPINNER_VISIBLE || spinnerFlag == SPINNER_VISIBLE_DISABLED) 일 때 다시 언급하겠습니다.)

여기 내 코드의 상당 부분이 있습니다 :

public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     insertList = (ListView) getActivity().findViewById(R.id.insertList); 
     /* Some code */ 

     tableSelector = (Spinner) getActivity().findViewById(R.id.tableSelector); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_dropdown_item,tables); 
     tableSelector.setAdapter(adapter); 
     tableSelector.setOnItemSelectedListener(new OnItemSelectedListener() { 
     /* Some code containing some Log.d() */ 
     }); 
     /* Some code */ 
     Log.d("Insert fragment", "Setting table selected by position in list " + pos + ", " + tName); 

     tableSelector.setSelection(pos); // pos is calculated correctly in the code i didn't show 

     switch(spinnerFlag) 
     { 
      case SPINNER_HIDDEN: tableSelector.setVisibility(View.GONE); break; 
      case SPINNER_VISIBLE: tableSelector.setVisibility(View.VISIBLE); break; 
      case SPINNER_VISIBLE_DISABLED: tableSelector.setVisibility(View.VISIBLE); 
               tableSelector.setEnabled(false); 
               break; 
      default: Log.d("onActivityCreated - InserFragment", "Spinner flag < " + spinnerFlag + " > does not exist. Spinner is now visible enabled."); 
     } 
    } 

tableSelector.setSelection(pos) 전에 Log가 로그 캣에 표시되어 있지만 tableSelector.onItemSelected();에서 Logs 중 어느 것도 표시되지 않습니다, 그래서 setSelection이 그것을 호출하지 않습니다. 그 이유는 무엇일까요? (나는 View을 GONE으로 설정하면 기능이 멈추는 것을 생각했지만, GONE으로 설정하기 전에 setSelection()라고 부름)

고마워!

FIXED 대신은 :

tableSelector.setVisibility(View.GONE); break; 

나는 해결 방법 사용 :

tableSelector.setVisibility(View.VISIBLE); 
tableSelector.setEnabled(false); 
ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) tableSelector.getLayoutParams(); 
params.height = 0; 
tableSelector.setLayoutParams(params); 
break; 

을 그리고 내가 그것을 필요가 작동합니다.

+0

보기를 GONE으로 설정하면 레이아웃에서 아무런 공간도 차지하지 않습니다.ListView는이 attr'android : layout_below = "@ + id/tableSelector"를 가지고 있습니다. 그러면 Spinner가 그 아래에 ListView를 설정합니다. –

답변

3

당신은 뷰는 레이아웃의 모든 공간을 차지하지 않는 GONE로 설정되면 목록보기 android:layout_alignWithParentIfMissing="true"

<ListView 
    android:id="@+id/insertList" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/tableSelector" 
    android:layout_above="@+id/saveButton" 
    android:background="#aaffffff" 
    android:divider="#11000000" 
    android:dividerHeight="4dp" 
    android:layout_alignWithParentIfMissing="true" 
    android:visibility="gone" > 

</ListView> 
+0

제 질문의 업데이트 된 버전을 살펴보십시오. 고맙습니다! – laurGanta

+0

위대한 당신이 해결했습니다! :) –

2

이 줄을 추가해야합니다. 귀하의 ListView에 이 있으니 Spinner 아래에 ListView을 설정합니다.

ListView에 간단히 회선 인 android:layout_alignWithParentIfMissing="true"을 추가하지 않으려면 누락 된 Spinner를 찾는 것을 무시하고 그 장소도 포함시켜야합니다. 희망이 도움이됩니다.

+0

제 질문의 업데이트 된 버전을 살펴보십시오. 고맙습니다! – laurGanta

+0

타아 뱅크스는 매력처럼 일했습니다! +1 : D –