【问题标题】:Changing Gridview Size from Preferences when Implementing Fragments实现片段时从首选项更改 Gridview 大小
【发布时间】:2014-11-10 02:20:41
【问题描述】:

我有一个 gridview 活动,我在其中使用自定义对象(带有一些自定义方法和 onclick 侦听器的图片)填充 gridview。我可以从首选项菜单中更改 gridview 的大小。一切都很顺利。

此后我为代码增加了一些复杂性。我现在不使用普通的 Activity 类,而是使用 FragmentActivity 类、fragmentPageAdapter 和我的 gridview 绑定到的片段。这是因为最终我希望应用程序允许用户从一个片段“滑动”到另一个片段。

由于以这种方式使用片段,每当我尝试从首选项菜单调整 gridview 的大小时,我都会注意到一个可重复的错误:一些对象的大小被正确调整,其他元素没有调整大小。相反,它们保持与更改首选项之前相同的大小。截图如下:

仅当我尝试从首选项菜单调整大小时才会发生这种情况。对我的 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
    }
}

我的片段(目前只有一个):

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

我的网格视图适配器:

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

我的自定义对象类。这些对象正在填充网格视图:

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>

最后,我的网格视图的 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>

【问题讨论】:

    标签: android gridview android-fragments


    【解决方案1】:

    为您的图像视图使用CENTER_INSIDE 比例类型。

     super.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    

    我要改变的另一件事是您处理列宽的方式。我会删除android:numColumns="auto_fit"。另一方面,您知道列数是WidthViewGrid/desiderePicSize 的上限,其中 WidthViewGrid 最常见的情况是屏幕的宽度。然后以编程方式,您可以使用 setNumberOfColumns 设置 GridView 的列数

    【讨论】:

      【解决方案2】:

      我会说:

      A.调用setColumnWidth 后调用gridview.invalidate()

      B.从更改首选项返回后 - 调用适配器的 notifyDataSetChanged 以确保它在适配器中重新创建视图(即 getView 将被调用)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多