这里是android / java的新手。我正在尝试创建一个带有可回收片段的应用程序来控制互联网上的电源开关。我创建了一个类来定义每个远程开关的值。在创建片段的新实例时,我使用setArguments将它们作为Bundle传递。 我推测,因为我正在回收多个远程开关的组件,我想要一个单独的片段活动类来处理脏工作。我需要做一些事情,比如检测点击按钮发送json调用以触发远程开关的切换,然后处理回调(最终)以在远程响应它实际切换继电器时实际更改指示器。 我假设这些是在Activity类中发生的事情,但我首先不确定如何访问片段中的属性(包括远程开关的定义以及我拉出句柄的位置)布局项目)以便操纵片段显示并将onClickListener分配给切换按钮等。
我需要做的第一件事就是知道应该在哪里定义按钮的onClickListener。我知道我可以使用另一个findViewById检索Button,但是当它们已经在片段中定义时,这似乎有些愚蠢。我只是不知道如何从活动本身回到片段来访问其中的属性和方法。而且我不确定应该定义点击监听器(传统上)。
这是我的片段代码:
RES /布局/ fragment_piswitch.xml
<Button
android:id="@+id/piToggle1"
android:layout_width="35dp"
android:layout_height="35dp"
android:text="O" />
<Switch
android:id="@+id/piStatus1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="38dp"
android:layout_marginTop="4dp"
android:clickable="false"
android:text="PiSwitch1"
android:theme="@style/ToggleSwitchTheme" />
<TextView
android:id="@+id/piInfo1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginTop="9dp"
android:layout_gravity="right"
android:text="(output)" />
</FrameLayout>
PiSwitchFragment.java
public class PiSwitchFragment extends Fragment {
PiSwitchFragmentActivity listener;
private PiSwitch fragSwitch = new PiSwitch();
public Button fragToggle;
public Switch fragStatus;
public TextView fragInfo;
public PiSwitchFragment() {
// Required empty public constructor
}
// This event fires 1st, before creation of fragment or any views
// The onAttach method is called when the Fragment instance is associated with an Activity.
// This does not mean the Activity is fully initialized.
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity){
this.listener = (PiSwitchFragmentActivity) context;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// check for arguments to initialize the PiSwitch
Bundle args = getArguments();
if(args != null) {
this.fragSwitch.setPiName(args.getString("name","(Unknown)"));
this.fragSwitch.setPiId(args.getCharArray("id"));
this.fragSwitch.setSwitchPin(args.getInt("pin",0));
this.fragSwitch.setSwitchState(args.getBoolean("state", false));
this.fragSwitch.setPiAddress(args.getString("addr",""));
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_piswitch, container, false);
}
// This event is triggered soon after onCreateView().
// Any view setup should occur here. E.g., view lookups and attaching view listeners.
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// Setup any handles to view objects here
this.fragToggle = (Button)view.findViewById(R.id.piToggle1);
this.fragStatus = (Switch)view.findViewById(R.id.piStatus1);
this.fragInfo = (TextView)view.findViewById(R.id.piInfo1);
this.updateInfo(this.fragSwitch.getPiName()); // update the display name
this.updateStatus(this.fragSwitch.getSwitchState()); // set the current displayed switch state
}
public void updateStatus(Boolean status) {
this.fragStatus.setChecked(status);
}
public void updateInfo(String inf) {
this.fragInfo.setText(inf);
}
}
PiSwitchFragmentActivity
public class PiSwitchFragmentActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//////////////////////////////////////////////////////////////
// not sure how to access the associated fragment from here //
//////////////////////////////////////////////////////////////
// where should onClickListener for piToggle1 button be defined? //
};
}