在片段中实现 onClickListener
Posted
技术标签:
【中文标题】在片段中实现 onClickListener【英文标题】:Implementing onClickListener in fragments 【发布时间】:2021-07-03 13:06:45 【问题描述】:我正在将旧版 android 应用程序从使用不再受支持的 ViewPager 和已弃用的 ActionBar 更新为受支持的类。我很难在我的片段中实现 OnClickListeners 并创建视图。以前的公共类 myFragment 会扩展 Fragment 并实现 OnClickListener。
以下是我目前所拥有的。
public class myFragment extends Fragment
Button btnOne;
@Override
public void onCreate(Bundle savedDataEntryInstanceState)
super.onCreate(savedDataEntryInstanceState);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View view = inflater.inflate(R.layout.my_fragment, container, false);
return view;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
fetchButtonClicks();
private void fetchButtonClicks()
View view = inflater.inflate(R.layout.my_fragment, container, false);
btnOne = (Button)view.findViewById(R.id.btnonexml);
btnOne.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Toast.makeText(getActivity(), "BtnOne click event occurred.", Toast.LENGTH_LONG).show();
);
问题在于在 fetchButtonClicks() 中实现视图。 两个问题:第一,关于查看创作,我在这里缺少什么,第二,有没有更好的方法来构建它?我在这个片段中有十几个按钮。提前致谢。
更新:下面的代码解决了我在片段中允许 OnClickListeners 的问题。这是我根据响应采用的结构。似乎很好地扩展到我的许多按钮。
public class dataEdit extends Fragment
Button btnUpdateRecord, btnDeleteRecord, btnResetForm, btnFirstRecord, btnPreviousRecord,btnNextRecord, btnLastRecord, btnHelp, btnEditComment;
private Button btnSaveRecord = null; //Make above buttons private and equal null???
private View view = null;
private View v = null;
@Override
public void onCreate(Bundle savedDataEntryInstanceState)
super.onCreate(savedDataEntryInstanceState);
setRetainInstance(true);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
view = inflater.inflate(R.layout.data_edit, container, false);
btnSaveRecord = (Button) view.findViewById(R.id.btnSaveRecordxml);
btnUpdateRecord = (Button)view.findViewById(R.id.btnUpdateRecordxml);
btnDeleteRecord = (Button)view.findViewById(R.id.btnDeleteRecordxml);
btnResetForm = (Button)view.findViewById(R.id.btnResetFormxml);
btnFirstRecord = (Button)view.findViewById(R.id.btnFirstRecordxml);
btnPreviousRecord = (Button)view.findViewById(R.id.btnPreviousRecordxml);
btnNextRecord = (Button)view.findViewById(R.id.btnNextRecordxml);
btnLastRecord = (Button)view.findViewById(R.id.btnLastRecordxml);
btnHelp = (Button)view.findViewById(R.id.btnDataEditHelpFilexml);
btnEditComment = (Button)view.findViewById(R.id.btnEditCommentxml);
return view;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
fetchButtonClicks();
private void fetchButtonClicks()
btnSaveRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
saveRecord(v);
);
btnUpdateRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
updateRecord(v);
);
btnDeleteRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
deleteRecord(v);
);
btnResetForm.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
resetForm();
);
btnFirstRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
firstRecord(v);
);
btnPreviousRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
previousRecord(v);
);
btnNextRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
nextRecord(v);
);
btnLastRecord.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
lastRecord(v);
);
btnHelp.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
showHelpDialog();
);
btnEditComment.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
showCommentEditDialog();
);
目前正在进行中:欢迎提出其他建议。谢谢。
【问题讨论】:
btnOne 在片段布局上?我看到你夸大了两种不同的观点 按钮位于该片段的选项卡上。我编辑了示例代码以反映这一点。感谢您了解这个。 AFAIKViewPager
未被弃用。可能是支持结束了
【参考方案1】:
您不需要 Inflate 视图两次,只需将 View 传递到您的 fetchButtonClicks
private void fetchButtonClicks(View view)
btnOne = (Button)view.findViewById(R.id.btnonexml);
btnOne.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Toast.makeText(getActivity(), "BtnOne click event occurred.", Toast.LENGTH_LONG).show();
);
在您的 onViewCreated()
方法上,只需像这样调用它:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
fetchButtonClicks(view);
【讨论】:
在 logcat 中得到以下错误,code
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a在 androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892) 在 androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl. java:1238)
你能用 my_fragment.xml 更新你的 a=question
您是否在onViewCreate()
或onCreateView()
上拨打了fetchButtonClicks()
电话
最初是从“OnViewCreate”开始的,我也只是从“OnCreateView”尝试过,得到了同样的 logcat 错误。谢谢。
你确定这个方法被调用了!请检查一下【参考方案2】:
有效
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_test, container, false);
button = (Button)view.findViewById(R.id.btnonexml);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
System.out.println("Klick");
);
return view;
【讨论】:
以上是关于在片段中实现 onClickListener的主要内容,如果未能解决你的问题,请参考以下文章
在 recyclerview 片段中实现上下文操作模式的问题
从片段中获取意图值后,我如何在 recyclerview 项目中实现单击