2017-09-29 2 views
0

J'essaie de changer la gravité d'un GridView chaque fois que je clique sur un bouton, mais l'application se bloque lors du déploiement. Je ne suis pas sûr pourquoi cela se produit lorsque le GridView a été déclaré dans la mise en page XML.GridView gravity ne changera pas

tentative d'invoquer la méthode virtuelle 'android.view.ViewGroup $ LayoutParams android.widget.GridView.getLayoutParams()' sur une référence d'objet null

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 public class activité {

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); 
     } 
    } 
} 

Répondre

1

Vous avez des boutons qui déclenchent la fonction moveup_click(). Dans cette fonction, vous voulez d'abord LayoutParams de GridView et ensuite vous initialisez le gridview lui-même. Ce n'est pas la bonne séquence. Pour le résoudre, vous pouvez déplacer la gridMain = findViewById(R.id.abslistview_main); la fonction oncreate ou AVANT LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) gridMain.getLayoutParams();. -

0

Vous avez également fait une erreur dans la méthode de création

absListView = findViewById(R.id.abslistview_main); 

cette ligne avec Retirer

gridMain = findViewById(R.id.abslistview_main);