如果我在片段的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
答案 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,请参考全局的代码,使其指向一个值。