2014-11-10 2 views
0

사용자 지정 개체 (일부 사용자 지정 메서드 및 onclick 수신기가있는 그림)로 gridview를 채우는 gridview 작업이있었습니다. 환경 설정 메뉴에서 gridview 크기를 변경할 수 있습니다. 모든 것이 아름답게 작동했습니다.조각 구현시 기본 설정에서 Gridview 크기 변경

이후 코드에 약간의 복잡성이 추가되었습니다. 일반 Activity 클래스를 사용하는 대신 FragmentActivity 클래스, fragmentPageAdapter 및 my gridview가 바인딩 된 조각을 사용하고 있습니다. 이것은 결국 앱이 사용자가 조각에서 조각으로 "스 와이프"할 수 있기를 원하기 때문입니다.

이 방법으로 조각을 사용했기 때문에 환경 설정 메뉴에서 gridview의 크기를 조정할 때마다 반복적 인 버그가 있음을 알았습니다. 개체의 크기가 제대로 조정되고 다른 요소의 크기가 조정되지 않습니다. 대신, 그들은 선호도를 변경하기 전에 가지고 있던 것과 동일한 크기를 유지합니다. 여기에 스크린 샷입니다 : 내가 환경 설정 메뉴에서 크기를 조정하려고하면

Example of Image not being resized.

에만이 발생합니다. 구성 변경과 같이 내 resize 메서드를 호출하면 모든 gridview 요소의 크기가 올바르게 조정됩니다.

나는 어떤 제안을 주셔서 감사합니다!

주요 활동 :

package com.KhalidSorensen.animalsounds; 

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.GridView; 

public class MainActivity extends FragmentActivity implements OnSharedPreferenceChangeListener{ 

    private MyFragment     m_myFragment = new MyFragment(); 
    private ViewPager     m_viewPager; 
    private static SharedPreferences m_prefs;   

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     m_prefs = PreferenceManager.getDefaultSharedPreferences(this);   
     m_prefs.registerOnSharedPreferenceChangeListener(this); 

     setContentView(R.layout.activity_main); 

     m_viewPager = (ViewPager) findViewById(R.id.pager); 
     m_viewPager.setAdapter(new MyAdapter(getSupportFragmentManager(), m_myFragment)); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     Log.i("Khalid","MainActivity: onSharedPreferenceChanged"); 

     if (key.equals("key_prefs_enable_lscape")){ 
      //do nothing for now 

     }else if (key.equals("key_prefs_picture_size")){    
      SetColumnWidth(m_myFragment.getM_gridView()); 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Log.i("Khalid","FragAnimalSounds: onConfigurationChanged"); 

     SetColumnWidth(m_myFragment.getM_gridView()); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     Log.i("Khalid","MainActivity: onCreateOptionsMenu"); 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.options_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.lbl_opt_menu_settings: 
      Intent i = new Intent("android.intent.action.PREFERENCES"); 
      startActivity(i); 
      break; 
     case R.id.lbl_opt_menu_quit: 
      finish(); 
      break; 
     default: 
      finish(); 
      break; 
     } 
     return true; 
    } 

    public static void SetColumnWidth(GridView GV) { 
     Log.i("Khalid","MainActivity: SetColumnWidth"); 

     int NumColumns, DesiredColumnWidth; 

     //Get the desired number of columns from the key prefs 
     NumColumns   = Integer.parseInt(m_prefs.getString("key_prefs_picture_size","2")); 

     //Determine the desired column width 
     if (NumColumns == 1){ 
      DesiredColumnWidth = 200; 
     }else if (NumColumns == 2){ 
      DesiredColumnWidth = 100; 
     }else{ 
      DesiredColumnWidth = 50; 
     } 

     //Set the desired column width 
     GV.setColumnWidth(DesiredColumnWidth); 
    } 
} 

class MyAdapter extends FragmentPagerAdapter{ 
    Fragment m_frag_A = null; 

    public MyAdapter(FragmentManager fm, Fragment A) { 
     super(fm); 
     m_frag_A = A; 
    } 

    @Override 
    public Fragment getItem(int i) { 
     return m_frag_A;   //only 1 item for now 
    } 

    @Override 
    public int getCount() { 
     return 1; 
    } 

    @Override 
    public CharSequence getPageTitle(int i) {  
     return "Title Frag A";  //only 1 item for now 
    } 
} 

MY FRAGMENT (ONLY ONE FOR 지금 거기는) :

package com.KhalidSorensen.animalsounds; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.GridView; 

public class MyFragment extends Fragment { 

    private GridView   m_gridView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     Log.i("Khalid","FragAnimalSounds: onCreateView"); 

     View view   = inflater.inflate(R.layout.activity_animal_sounds, container, false); 
     m_gridView   = (GridView) view.findViewById(R.id.lbl_gridView); 
     m_gridView.setAdapter(new VivzAdapter(view.getContext())); 
     MainActivity.SetColumnWidth(m_gridView); 

     return view; 
    } 

    public GridView getM_gridView() { 
     return m_gridView; 
    } 
} 

MY GRIDVIEW 어댑터 :

package com.KhalidSorensen.animalsounds; 

import java.util.ArrayList; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 

public class VivzAdapter extends BaseAdapter { 

    private Context     m_context; 
    private ArrayList<AnimalKind> m_list = new ArrayList<AnimalKind>(); 
    VivzAdapter(Context ctx) { 
     m_context = ctx; 

     int[] animalphotos = { R.drawable.cat_1, R.drawable.cow_1, 
       R.drawable.dog_1, R.drawable.donkey_1, R.drawable.duck_1, 
       R.drawable.peacock_1, R.drawable.rooster_1, R.drawable.seal_1 }; 

     for (int i = 0; i <= 7; i++) { 
      AnimalKind animalKind = new AnimalKind(m_context, animalphotos[i]); 
      m_list.add(animalKind); 
     } 
    } 

    @Override 
    public int getCount() { 
     return m_list.size(); 
    } 

    @Override 
    public AnimalKind getItem(int position) { 
     return m_list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int i, View v, ViewGroup vg) { 
     return m_list.get(i); 
    } 
} 
다음

내 코드입니다

내 맞춤 개체 수업. 이러한 개체는 GRIDVIEW을 채우기됩니다

package com.KhalidSorensen.animalsounds; 

import android.content.Context; 
import android.graphics.Color; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 


public class AnimalKind extends ImageView implements OnClickListener{ 

    private int    m_imageId; 

    public AnimalKind(Context ctx, int imageId) { 
     super(ctx); 

     m_imageId = imageId; 

     super.setImageResource(imageId); 
     super.setAdjustViewBounds(true); 
     super.setScaleType(ImageView.ScaleType.FIT_XY); 
     super.setPadding(1, 1, 1, 1); 
     super.setBackgroundColor(Color.BLACK); 
     super.setOnClickListener(this); 
     } 


    //@Override 
    public void onClick(View v) { 
     //Do Something 
    } 

    @Override 
    public void setPressed(boolean pressed) { 
     //Do Something 
    } 

    public int getM_imageId() { 
     return m_imageId; 
    } 
} 

내 환경 활동 :

package com.KhalidSorensen.animalsounds; 

import android.os.Bundle; 
import android.preference.PreferenceActivity; 
import android.util.Log; 

public class Preferences extends PreferenceActivity { 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     Log.i("Khalid", "Preferences: onCreate"); 
    } 
} 

내 주요 활동에 대한 나의 XML :

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v4.view.PagerTitleStrip 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/lbl_title" 
     android:background="#33B5E5" 
     android:layout_gravity="top" 
     android:paddingTop="0dp" 
     android:paddingBottom="0dp"> " 
    </android.support.v4.view.PagerTitleStrip> 

</android.support.v4.view.ViewPager> 

그리고 마지막으로, GRIDVIEW 내 XML :

<?xml version="1.0" encoding="utf-8"?> 

    <GridView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/lbl_gridView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center_horizontal" 
     android:layout_margin="0px" 
     android:alwaysDrawnWithCache="false" 
     android:animateLayoutChanges="false" 
     android:background="@android:color/white" 
     android:columnWidth="130dp" 
     android:drawSelectorOnTop="true" 
     android:horizontalSpacing="@dimen/activity_horizontal_margin" 
     android:listSelector="@null" 
     android:numColumns="auto_fit" 
     android:padding="@dimen/activity_horizontal_margin" 
     android:scrollbarStyle="insideOverlay" 
     android:smoothScrollbar="true" 
     android:stretchMode="none" 
     android:verticalSpacing="@dimen/activity_vertical_margin" > 
    </GridView> 

답변

0

CENTER_INSIDE은 이미지보기의 눈금 유형입니다.

super.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

내가 바꿀 또 다른 사항은 열 너비를 처리하는 방식입니다. android:numColumns="auto_fit"을 삭제합니다. 반면에 열의 수는 WidthViewGrid/desiderePicSize인데, 여기서 WidthViewGrid의 가장 일반적인 경우는 화면의 너비입니다. 다음 프로그램이 setNumberOfColumns

0

와의 GridView의 열 수를 설정할 수 있습니다에 나는 말할 것입니다 :

A. setColumnWidth 호출 있는 gridview를 호출 후.변화 환경에서 돌아온 후) (

B를 무효화 - 만들기 위해 어댑터의 notifyDataSetChanged 위해 전화는 어댑터의 의견을 (getView가 호출됩니다 즉)

다시 생성해야합니다