2013-03-11 41 views
0

我正在创建一个动态壁纸设置活动。它有几个搜索栏和一个Ad Mob广告视图。每当我触摸其中一个搜索栏时,广告会暂时消失,然后重新加载一个新添加。不过,当其他任何偏好被触动时,广告都不会改变。如何在触摸搜索栏首选项时停止重新加载广告?我非常难过这个:-)。代码如下:AdView每次请求新添加SeekBar被触动

广告偏好类:

import android.app.Activity; 
import android.content.Context; 
import android.preference.Preference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 

import com.google.ads.AdRequest; 
import com.google.ads.AdSize; 
import com.google.ads.AdView; 

public class AdPreference extends Preference { 

    public AdPreference(Context context, AttributeSet attrs, int defStyle) {super (context, attrs, defStyle);} 
    public AdPreference(Context context, AttributeSet attrs) {super(context, attrs);} 
    public AdPreference(Context context) {super(context);} 

    @Override 
    protected View onCreateView(ViewGroup parent) { 
     // this will create the linear layout defined in ads_layout.xml 
     View view = super.onCreateView(parent); 

     // the context is a PreferenceActivity 
     Activity activity = (Activity)getContext(); 

     // Create the adView 
     AdView adView = new AdView(activity, AdSize.BANNER, "a151390e12917b5"); 

     ((LinearLayout)view).addView(adView); 

     // Initiate a generic request to load it with an ad 
     AdRequest request = new AdRequest(); 
     request.addTestDevice("23392C83B8B55DE893A18286CB92DDA2"); 
     request.addTestDevice("E1BAA0317138AEE05268B2E4F76B2D3F"); 
     adView.loadAd(request);  

     return view;  
    } 
} 

搜索栏类:

import android.content.Context; 
import android.content.res.TypedArray; 
import android.preference.Preference; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewParent; 
import android.widget.RelativeLayout; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.widget.TextView; 

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener { 

    private final String TAG = getClass().getName(); 

    private static final String ANDROIDNS="http://schemas.android.com/apk/res/android"; 
    private static final String ROBOBUNNYNS="http://robobunny.com"; 
    private static final int DEFAULT_VALUE = 50; 

    private int mMaxValue  = 100; 
    private int mMinValue  = 0; 
    private int mInterval  = 1; 
    private int mCurrentValue; 
    private String mUnitsLeft = ""; 
    private String mUnitsRight = ""; 
    private SeekBar mSeekBar; 

    private TextView mStatusText; 

    public SeekBarPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initPreference(context, attrs); 
    } 

    public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initPreference(context, attrs); 
    } 

    private void initPreference(Context context, AttributeSet attrs) { 
     setValuesFromXml(attrs); 
     mSeekBar = new SeekBar(context, attrs); 
     mSeekBar.setMax(mMaxValue - mMinValue); 
     mSeekBar.setOnSeekBarChangeListener(this); 
    } 

    private void setValuesFromXml(AttributeSet attrs) { 
     mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", 100); 
     mMinValue = attrs.getAttributeIntValue(ROBOBUNNYNS, "min", 0); 

     mUnitsLeft = getAttributeStringValue(attrs, ROBOBUNNYNS, "unitsLeft", ""); 
     String units = getAttributeStringValue(attrs, ROBOBUNNYNS, "units", ""); 
     mUnitsRight = getAttributeStringValue(attrs, ROBOBUNNYNS, "unitsRight", units); 

     try { 
      String newInterval = attrs.getAttributeValue(ROBOBUNNYNS, "interval"); 
      if(newInterval != null) 
       mInterval = Integer.parseInt(newInterval); 
     } 
     catch(Exception e) { 
      Log.e(TAG, "Invalid interval value", e); 
     } 

    } 

    private String getAttributeStringValue(AttributeSet attrs, String namespace, String name, String defaultValue) { 
     String value = attrs.getAttributeValue(namespace, name); 
     if(value == null) 
      value = defaultValue; 

     return value; 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent){ 

     RelativeLayout layout = null; 

     try { 
      LayoutInflater mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      layout = (RelativeLayout)mInflater.inflate(R.layout.seek_bar_preference, parent, false); 
     } 
     catch(Exception e) 
     { 
      Log.e(TAG, "Error creating seek bar preference", e); 
     } 

     return layout; 

    } 

    @Override 
    public void onBindView(View view) { 
     super.onBindView(view); 

     try 
     { 
      // move our seekbar to the new view we've been given 
      ViewParent oldContainer = mSeekBar.getParent(); 
      ViewGroup newContainer = (ViewGroup) view.findViewById(R.id.seekBarPrefBarContainer); 

      if (oldContainer != newContainer) { 
       // remove the seekbar from the old view 
       if (oldContainer != null) { 
        ((ViewGroup) oldContainer).removeView(mSeekBar); 
       } 
       // remove the existing seekbar (there may not be one) and add ours 
       newContainer.removeAllViews(); 
       newContainer.addView(mSeekBar, ViewGroup.LayoutParams.FILL_PARENT, 
         ViewGroup.LayoutParams.WRAP_CONTENT); 
      } 
     } 
     catch(Exception ex) { 
      Log.e(TAG, "Error binding view: " + ex.toString()); 
     } 

     updateView(view); 
    } 

    /** 
    * Update a SeekBarPreference view with our current state 
    * @param view 
    */ 
    protected void updateView(View view) { 

     try { 
      RelativeLayout layout = (RelativeLayout)view; 

      mStatusText = (TextView)layout.findViewById(R.id.seekBarPrefValue); 
      mStatusText.setText(String.valueOf(mCurrentValue)); 
      mStatusText.setMinimumWidth(30); 

      mSeekBar.setProgress(mCurrentValue - mMinValue); 

      TextView unitsRight = (TextView)layout.findViewById(R.id.seekBarPrefUnitsRight); 
      unitsRight.setText(mUnitsRight); 

      TextView unitsLeft = (TextView)layout.findViewById(R.id.seekBarPrefUnitsLeft); 
      unitsLeft.setText(mUnitsLeft); 

     } 
     catch(Exception e) { 
      Log.e(TAG, "Error updating seek bar preference", e); 
     } 

    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     int newValue = progress + mMinValue; 

     if(newValue > mMaxValue) 
      newValue = mMaxValue; 
     else if(newValue < mMinValue) 
      newValue = mMinValue; 
     else if(mInterval != 1 && newValue % mInterval != 0) 
      newValue = Math.round(((float)newValue)/mInterval)*mInterval; 

     // change rejected, revert to the previous value 
     if(!callChangeListener(newValue)){ 
      seekBar.setProgress(mCurrentValue - mMinValue); 
      return; 
     } 

     // change accepted, store it 
     mCurrentValue = newValue; 
     mStatusText.setText(String.valueOf(newValue)); 
     persistInt(newValue); 

    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) {} 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     notifyChanged(); 
    } 


    @Override 
    protected Object onGetDefaultValue(TypedArray ta, int index){ 

     int defaultValue = ta.getInt(index, DEFAULT_VALUE); 
     return defaultValue; 

    } 

    @Override 
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 

     if(restoreValue) { 
      mCurrentValue = getPersistedInt(mCurrentValue); 
     } 
     else { 
      int temp = 0; 
      try { 
       temp = (Integer)defaultValue; 
      } 
      catch(Exception ex) { 
       Log.e(TAG, "Invalid default value: " + defaultValue.toString()); 
      } 

      persistInt(temp); 
      mCurrentValue = temp; 
     } 

    } 

} 

的XML布局设置活动:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:robobunny="http://robobunny.com" 
    android:key="disco_wormhole_settings" > 

    <com.package.name.and.AdPreference 
     android:layout_width="fill_parent" 
     androidLlayout_height="wrap_content" /> 

    <Preference 
     android:key="title" 
     android:summary="@string/settings_summary" 
     android:title="@string/settings_title" /> 

    <com.package.name.and.SeekBarPreference 
     android:defaultValue="50" 
     android:key="flight_speed" 
     android:max="100" 
     android:progressDrawable="@drawable/seek_bar_progress" 
     android:summary="@string/flight_speed_summary" 
     android:title="@string/flight_speed_title" 
     robobunny:min="1" 
     robobunny:unitsLeft="" 
     robobunny:unitsRight="%" /> 
    <com.package.name.and.SeekBarPreference 
     android:defaultValue="30" 
     android:key="num_rings" 
     android:max="40" 
     android:progressDrawable="@drawable/seek_bar_progress" 
     android:summary="@string/num_rings_summary" 
     android:title="@string/num_rings_title" 
     robobunny:min="1" 
     robobunny:unitsLeft="" 
     robobunny:unitsRight="" /> 
    <com.package.name.and.SeekBarPreference 
     android:defaultValue="50" 
     android:key="particle_speed" 
     android:max="100" 
     android:progressDrawable="@drawable/seek_bar_progress" 
     android:summary="@string/particle_speed_summary" 
     android:title="@string/particle_speed_title" 
     robobunny:min="1" 
     robobunny:unitsLeft="" 
     robobunny:unitsRight="%" /> 

    <Preference 
     android:summary="@string/colors_summary" 
     android:title="@string/colors_title" > 
    </Preference> 
    <Preference 
     android:defaultValue="0xff7d9fff" 
     android:key="color_one" 
     android:title="@string/color_one" > 
    </Preference> 
    <Preference 
     android:defaultValue="0xffff4b31" 
     android:key="color_two" 
     android:title="@string/color_two" > 
    </Preference> 
    <Preference 
     android:defaultValue="0xff64ff46" 
     android:key="color_three" 
     android:title="@string/color_three" > 
    </Preference> 

    <CheckBoxPreference 
     android:defaultValue="true" 
     android:key="use_space_dust" 
     android:title="@string/use_space_dust_title" /> 

    <Preference 
     android:key="spacer" 
     android:title="@string/single_space" /> 
    <Preference> 
    </Preference> 

</PreferenceScreen> 

提前感谢你的帮助,

Chris

回答

1

我认为onCreateView将被多次调用,所以每次都会创建一个广告请求。尝试将你的admob代码移动到onBind或onAttached之类的东西上。

+0

你说得对。每次触摸搜索栏首选项时都会调用onCreateView(WAT?)。我将我的添加请求代码移动到onAttachedToActivity。我也只通过一个空检查在onCreateView中添加视图给父项。 – orb 2013-03-12 18:05:00