2012-11-17 90 views
0

我試圖使android-playground projectSwipeyTabsSampleActivity如何不會產生編譯錯誤?

這裏開發從SwipeyTabsSampleActivity另一個樣品是示例代碼,我的問題是,爲什麼我沒有在在方法getTab兩個變量的引用「mViewPager」 &「位置」得到一個編譯錯誤 - > view.setOnClickListener

以下是完整的示例源代碼。我首先嚐試了示例代碼,它編譯並運行良好,我不知道當我試圖根據自己的需要定製示例時該怎麼辦。一切都很順利(編譯&運行)除非我打算設置onClickListener並引用這兩個變量,我得到了以下兩個編譯錯誤 1-無法對非靜態字段進行靜態引用mViewPager 2-無法引用在不同的方法中定義的內部類中的非最終變量位置

我認爲這兩個錯誤應該出現在示例代碼中,不僅僅是我的代碼,但我不知道爲什麼?

/* 
* Copyright 2011 Peter Kuterna 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package net.peterkuterna.android.apps.swipeytabs; 

import android.content.Context; 
import android.os.Bundle; 
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.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

public class SwipeyTabsSampleActivity extends FragmentActivity { 

    private static final String [] TITLES = { 
     "CATEGORIES", 
     "FEATURED", 
     "TOP PAID", 
     "TOP FREE", 
     "TOP GROSSING", 
     "TOP NEW PAID", 
     "TOP NEW FREE", 
     "TRENDING", 
    }; 

    private SwipeyTabs mTabs; 
    private ViewPager mViewPager; 

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

     setContentView(R.layout.activity_swipeytab); 

     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mTabs = (SwipeyTabs) findViewById(R.id.swipeytabs); 

     SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(this, 
       getSupportFragmentManager()); 
     mViewPager.setAdapter(adapter); 
     mTabs.setAdapter(adapter); 
     mViewPager.setOnPageChangeListener(mTabs); 
     mViewPager.setCurrentItem(0); 
    } 

    private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements 
      SwipeyTabsAdapter { 

     private final Context mContext; 

     public SwipeyTabsPagerAdapter(Context context, FragmentManager fm) { 
      super(fm); 

      this.mContext = context; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return SwipeyTabFragment.newInstance(TITLES[position]); 
     } 

     @Override 
     public int getCount() { 
      return TITLES.length; 
     } 

     public TextView getTab(final int position, SwipeyTabs root) { 
      TextView view = (TextView) LayoutInflater.from(mContext).inflate(
        R.layout.swipey_tab_indicator, root, false); 
      view.setText(TITLES[position]); 
      view.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        mViewPager.setCurrentItem(position); 
       } 
      }); 

      return view; 
     } 

    } 

} 

回答

1

getTab()是一個非靜態內部類的SwipeyTabsSampleActivity的一個實例的方法,所以它有其外類實例的隱式引用,並且可以訪問所有字段和該實例的方法,以及由此mViewPagerOnclickListener是內部類SwipeyTabsSampleActivity的匿名內部類,因此也可以訪問其兩個外部類實例的所有字段和方法。

如果內部類是靜態的,它將不會編譯。如果mViewPagergetTab()方法的非最終局部變量,則它也不會編譯。