可以引用片段的xml布局中定义的元素(如按钮)并在另一个活动中使用它吗?
我尝试这样做,但是有空对象引用。
fragment_date_picker.xml
<TimePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timePicker"
android:layout_gravity="center_horizontal|top" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ok"
android:id="@+id/bt_ok"
android:layout_gravity="center" />
MainActivity.java
btPickTime=(Button)findViewById(R.id.bt_pickTime);
AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
final DatePickerFragment dp=new DatePickerFragment();
btOk=(Button)findViewById(R.id.bt_ok);
btOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(dp);
ft.commit();
}
});
btPickTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.ll_main
,dp);
ft.commit();
}
});
答案 0 :(得分:3)
要删除Fragment
,请通过按钮按下所述片段。
方法一(可能是最简单的)
我还没有对此进行测试,因此可能无法实现...但您可以尝试从此片段中访问FragmentManager
,然后将其自行删除。在这种情况下,您可以在onClick()
内调用此内容。您可能需要在getActivity()
前面放置getFragmentManager()
。
getFragmentManager().beginTransaction().remove(this).commit();
方法二(几乎一样简单,但做法不好)
将上述逻辑放在您Activity
附加到的Fragment
班级的公开方法中,并在Fragment
onClick()
内访问,如下所示:
((MyActivityName)getActivity()).nameOfPublicMethodToRemoveFragment();
方法三(Fragment
与Activity
进行沟通的推荐方式
使用interface
(从here拉出的示例):
public class BlankFragment extends Fragment implements View.OnClickListener{
private View rootView;
private Button button;
private OnFragmentInteractionListener mListener;
public static BlankFragment newInstance() {
return new BlankFragment();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_blank, container, false);
button = (Button) rootView.findViewById(R.id.fragment_button);
button.setOnClickListener(this);
return rootView;
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void onClick(View v) {
mListener.onFragmentInteraction();
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction();
}
}
主要活动
public class MainActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getFragmentManager().findFragmentById(R.id.fragment_container) == null) {
getFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, BlankFragment.newInstance())
.commit();
}
}
@Override
public void onFragmentInteraction() {
//Remove Fragment Here
}
}
方法四(备选方案)
使用EventBus从片段与活动进行通信
答案 1 :(得分:-1)
您是否尝试将按钮声明为MainActivity中的变量,并在片段的OnCreate中设置其值?