2017-09-29 3 views
0

버튼을 클릭 할 때마다 GridView의 중력을 변경하려고하지만 전개시 응용 프로그램이 중단됩니다. GridView가 XML 레이아웃에서 선언되었을 때 이것이 왜 발생하는지 확신 할 수 없습니다. 널 객체 참조에 ')의 LayoutParams android.widget.GridView.getLayoutParams android.view.ViewGroup $ ('가상 메소드를 호출GridView 중력이 변경되지 않습니다

시도

sw600dp/activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    tools:context=".MainActivity"> 
    <Button 
     android:id="@+id/btn_moveup" 
     android:text="move up" 
     android:background="@android:color/transparent" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_gravity="top" 
     android:onClick="moveup_click" 
     /> 

    <GridView 
     android:id="@+id/abslistview_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:numColumns="auto_fit" 
     /> 

    <Button 
     android:id="@+id/btn_movedown" 
     android:text="move down" 
     android:background="@android:color/transparent" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_gravity="bottom" 
     android:onClick="movedown_click" 
     /> 
</LinearLayout> 

MainActivity.java 공용 클래스 MainActivity는 활동 {

를 확장
Activity mActivity; 
    private Button btnUp; 
    private Button btnDown; 
    private GridView gridMain; 

    private AbsListView absListView; 
    private ArrayAdapter<MainItem> adapter; 
    private ArrayList<MainItem> mainArrayList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     absListView = findViewById(R.id.abslistview_main); 
     settingData(); 

     adapter = new AbsListViewAdapter(this, R.layout.item_abslistview, mainArrayList); 
     absListView.setAdapter(adapter); 
    } 

    private void settingData() { 
     mainArrayList = new ArrayList<>(); 

     mainArrayList.add(new MainItem(R.drawable.ic_circle, getResources().getString(R.string.item_1))); 
     mainArrayList.add(new MainItem(R.drawable.ic_star, getResources().getString(R.string.item_2))); 
     mainArrayList.add(new MainItem(R.drawable.ic_square, getResources().getString(R.string.item_3))); 
     mainArrayList.add(new MainItem(R.drawable.ic_triangle, getResources().getString(R.string.item_4))); 
     mainArrayList.add(new MainItem(R.drawable.ic_rectangle, getResources().getString(R.string.item_5))); 
     mainArrayList.add(new MainItem(R.drawable.ic_crescent, getResources().getString(R.string.item_6))); 
    } 

    public void moveup_click(View view) { 
     LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) gridMain.getLayoutParams(); 
     gridMain = findViewById(R.id.abslistview_main); 
     if (params.gravity == Gravity.BOTTOM) { 
      gridMain.setGravity(Gravity.CENTER_VERTICAL); 
      btnDown.setVisibility(View.VISIBLE); 
     } else if (params.gravity == Gravity.CENTER_VERTICAL) { 
      gridMain.setGravity(Gravity.TOP); 
      btnUp.setVisibility(View.GONE); 
     } 
    } 
} 

답변

1

moveup_click() 기능을 실행하는 버튼이 있습니다. 이 함수에서 먼저 GridView의 LayoutParams을 원한다. 그리드 뷰 자체를 초기화한다. 이것은 올바른 순서가 아닙니다.

해결하려면 gridMain = findViewById(R.id.abslistview_main);oncreate 함수 또는 BEFORE LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) gridMain.getLayoutParams();을 옮길 수 있습니다. - 또한

gridMain = findViewById(R.id.abslistview_main); 
와 함께이 줄을 제거 만드는 방법

absListView = findViewById(R.id.abslistview_main); 

에서 실수를 한

0

관련 문제