Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在实现片段时从首选项更改Gridview大小_Android_Gridview_Android Fragments - Fatal编程技术网

Android 在实现片段时从首选项更改Gridview大小

Android 在实现片段时从首选项更改Gridview大小,android,gridview,android-fragments,Android,Gridview,Android Fragments,我有一个gridview活动,我用一个自定义对象填充gridview,用一些自定义方法和onclick侦听器填充图片。我可以从“首选项”菜单更改gridview大小。一切都很顺利 此后,我给代码增加了一些复杂性。我现在使用FragmentActivity类、fragmentPageAdapter和绑定到gridview的片段,而不是使用普通活动类。这是因为最终我希望应用程序允许用户在片段之间滑动 由于以这种方式使用片段,每当我尝试从“首选项”菜单调整gridview的大小时,我都会注意到一个可重

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

此后,我给代码增加了一些复杂性。我现在使用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.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");
    }
}
<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>
我的片段目前只有一个:

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;
    }
}
我的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.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.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");
    }
}
<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:

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.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");
    }
}
<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:

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;
    }
}
<?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>
在图像视图的比例类型中使用“居中”

 super.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
我要改变的另一件事是处理列宽的方式。我会删除android:numColumns=auto_-fit。另一方面,您知道列的数量是WidthViewGrid/desiderePicSize的大小,其中WidthViewGrid最常见的情况是屏幕的宽度。然后,您可以通过编程方式使用setNumberOfColumns设置GridView的列数,我想说:

A.调用gridview.invalidate后

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