0

私はandroid-playgroundプロジェクトで開発されたSwipeyTabsSampleActivityから別のサンプルを作成しようとしていました

これがサンプルコードです。私の質問は、メソッドgetTab->view.setOnClickListenerで2つの変数「mViewPager」と「position」を参照したときにコンパイルエラーが発生しなかった理由です。

これが完全なサンプルソースコードです。私は最初にサンプルコードを試しましたが、必要に応じてサンプルをカスタマイズしようとしたときに、どのようにコンパイルされて実行されたかはわかりません。onClickListenerを設定し、これら2つの変数を参照する場合を除いて、すべてが正常に実行されました。次の2つのコンパイルエラーが発生しました。1-非静的フィールドへの静的参照を作成できません。mViewPager2-非静的フィールドを参照できません。別のメソッドで定義された内部クラス内の最終変数位置

これらの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;
        }

    }

}
4

1 に答える 1

1

getTab()はの非静的内部クラスのインスタンスメソッドであるSwipeyTabsSampleActivityため、外部クラスインスタンスへの暗黙の参照があり、このインスタンスのすべてのフィールドとメソッド、つまりにアクセスできますmViewPager。は、のOnclickListener内部クラスの匿名の内部クラスであるためSwipeyTabsSampleActivity、2つの外部クラスインスタンスのすべてのフィールドとメソッドにもアクセスできます。

内部クラスが静的である場合、コンパイルされません。mViewPagerメソッドの非最終ローカル変数である場合getTab()、どちらもコンパイルされません。

于 2012-11-17T14:01:36.367 に答える