从类方法中访问onCreateView()中声明的变量

时间:2014-03-03 16:39:45

标签: java variables scope

如果我在片段的onCreateView中声明了变量;有没有办法可以从onCreateView外部访问这些变量?

 public View onCreateView(LayoutInflater viewInflation, ViewGroup container,
            Bundle SavedInstantState) {
        superContext = getActivity().getApplicationContext();
        digitalfragmentview = viewInflation.inflate(
                R.layout.digitalfragment_page, container, false);

        digitalIO0Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio0mode);
        digitalIO1Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio1mode);
        digitalIO2Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio2mode);
        digitalIO3Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio3mode);
        digitalIO4Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio4mode);
        digitalIO5Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio5mode);
        digitalIO6Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio6mode);
        digitalIO7Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio7mode);
        digitalIO8Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio8mode);
        digitalIO9Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio9mode);


        centralDigitalTable = (TableLayout) digitalfragmentview
                .findViewById(R.id.digitalTable);

        Switch[] digitalIOModeSwitchArray = {digitalIO0Mode, digitalIO1Mode,
                digitalIO2Mode, digitalIO3Mode, digitalIO4Mode, digitalIO5Mode,
                digitalIO6Mode, digitalIO7Mode, digitalIO8Mode, digitalIO9Mode};


        return digitalfragmentview;
    }

现在我在课堂上有这些方法:

   public Switch getIOModeSwitch(int index) {
        return digitalIOModeSwitchArray[index];
    }

    public void getIOModeSwitch(int index, boolean status) {
        digitalIOModeSwitchArray[index].setActivated(status);
    }

然而;他们显然无法访问digitalIOModeSwitchArray,因为它超出了他们的范围并且本地化为onCreateView方法。

我试图在类的标题之后放置所有变量,但是如果我这样做的话,数组似乎填充为null,所以我显然不能这样做。

编辑1:

例如,

如果我这样做 -

public class digitalFragment extends FragmentActivity{
digitalIO0Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio0mode);
        digitalIO1Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio1mode);
        digitalIO2Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio2mode);
        digitalIO3Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio3mode);
        digitalIO4Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio4mode);
        digitalIO5Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio5mode);
        digitalIO6Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio6mode);
        digitalIO7Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio7mode);
        digitalIO8Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio8mode);
        digitalIO9Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio9mode);
Switch[] digitalIOModeSwitchArray = {digitalIO0Mode, digitalIO1Mode,
                digitalIO2Mode, digitalIO3Mode, digitalIO4Mode, digitalIO5Mode,
                digitalIO6Mode, digitalIO7Mode, digitalIO8Mode, digitalIO9Mode};


    public View onCreateView(LayoutInflater viewInflation, ViewGroup container,
            Bundle SavedInstantState) {
        superContext = getActivity().getApplicationContext();
        digitalfragmentview = viewInflation.inflate(
                R.layout.digitalfragment_page, container, false);



        // sets the listener for the mode switches
        for (int i = 0; i < digitalIOModeSwitchArray.length; i++) {
            if (digitalIOModeSwitchArray[i] == null) {
                Log.d(TAG, "Array is null at:" + i);
            }
        }

        return digitalfragmentview;
    }

}

logcat输出如下:

Array is null at: 1
Array is null at: 2
Array is null at: 3
Array is null at: 4
Array is null at: 5
Array is null at: 6
Array is null at: 7
Array is null at: 8
Array is null at: 9

3 个答案:

答案 0 :(得分:1)

不,您无法从声明范围之外的地方访问本地变量。

您必须将它们声明为类中的成员字段。查看Member Variables上的官方教程。

class Example {

    int field;
    int hello = 2; // initialized to 2
    int there;
    Object[] array = new Object[50]; // array initialized here, all elements null

    Example () {
       there = 2; // can also be initialized in constructor
       // initialize each element of array:
       for (int n = 0; n < array.length; ++ n)
           array[n] = new Object();
    }

    void a () {
       int local;
       local = 1; // ok
       field = 1; // ok
       hello = 1; // ok
       there = 1; // ok
    }

    void b () {
       System.out.println(local); // no 'local' declared here
       System.out.println(field); // ok
       System.out.println(hello); // ok
       System.out.println(there); // ok
    }

}

编辑:扩展示例re:评论和编辑发布。

答案 1 :(得分:1)

根据您的修改,您尝试在digitalIO1Mode甚至意识到它们之前将您的变量(View等)初始化为Activity s,因此它们是全部为空。

尝试将Switch digitalIO1Mode;Switch digitalIO2Mode;等放在onCreate之前,然后在致电setContenView之后,当你将它们设置为等{{1}时}}秒。

答案 2 :(得分:1)

只是解释为什么这对OP不起作用

public class digitalFragment extends FragmentActivity{

digitalIO0Mode = (Switch) digitalfragmentview
                 .findViewById(R.id.digitalio0mode);

你还没有夸大数码碎片视图,所以找不到R.id.digitalio0mode。我很惊讶你实际上没有使用NullPointerException崩溃,因为digitalfragmentview在这里可能应该为null,但是我没有看到你对该视图的声明声明,所以你可以将其他视图加载到其中是合理的。

Switch[] digitalIOModeSwitchArray = {digitalIO0Mode, digitalIO1Mode,
            digitalIO2Mode, digitalIO3Mode, digitalIO4Mode, digitalIO5Mode,
            digitalIO6Mode, digitalIO7Mode, digitalIO8Mode, digitalIO9Mode};

这不起作用,因为如上所述,直到你给视图充气才能找到开关,所以最好只是在这里放置空值。

您这样做的方法只是将switch的定义声明为字段。

Switch[] digitalIOModeSwitchArray;

然后在你的创建中,只保留原始帖子中的相同代码,除了不定义本地Switch [] digitalIOModeSwitchArray,请参考全局的代码,使其指向一个值。