Java 从活动访问片段方法中的方法
我正在使用带有(片段)的Java 从活动访问片段方法中的方法,java,android,Java,Android,我正在使用带有(片段)的androidx导航抽屉,HomeFragment由RecyclerView组成以显示图像。 我试图调用getMenu()方法来更新MainActivity中的图像,但它不起作用 我尝试使用此main活动,但它不起作用 HomeFragment fragment=new HomeFragment(); fragment.getMenu(); ==============================================家庭片段===============
androidx
导航抽屉,HomeFragment
由RecyclerView
组成以显示图像。
我试图调用getMenu()
方法来更新MainActivity
中的图像,但它不起作用
我尝试使用此main活动
,但它不起作用
HomeFragment fragment=new HomeFragment();
fragment.getMenu();
==============================================家庭片段================================
public class HomeFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
recycler_menu = (RecyclerView)view.findViewById(R.id.recycler_menu);
recycler_menu.setLayoutManager(new GridLayoutManager(context,2));
recycler_menu.setHasFixedSize(true);
mService = Common.getAPI();
getMenu();
return view;
}
public void getMenu() {
compositeDisposable.add(mService.getMenu()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<List<Category>>() {
@Override
public void accept(List<Category> categories) throws Exception {
displayMenuList(categories);
}
}));
}
private void displayMenuList(List<Category> categories) {
MenuAdapter adapter = new MenuAdapter(context,categories);
recycler_menu.setAdapter(adapter);
}
}
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu_action_bar ID as a set of Ids because each
// menu_action_bar should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_send)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public void onResume() {
super.onResume();
HomeFragment fragment=new HomeFragment();
fragment.getMenu();
}
}
您不能这样做,因为该方法无效,结果由另一个方法返回,并且它在您的片段中 您应该创建一个接口,将数据从片段传递到活动 HomeFragment:
public class HomeFragment extends Fragment {
private OnAcceptListener listener;
//...
public void getMenu() {
compositeDisposable.add(mService.getMenu()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<List<Category>>() {
@Override
public void accept(List<Category> categories) throws Exception {
listener.onAccept(categories);
}
}));
}
public void setOnAcceptListener(OnAcceptListener listener) {
this.listener = listener;
}
public interface OnAcceptListener{
void onAccept(List<Category> categories);
}
}
公共类HomeFragment扩展了片段{
专用OnAcceptListener侦听器;
//...
公共菜单(){
compositeDisposable.add(mService.getMenu())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.订阅(新消费者){
@凌驾
public void accept(列表类别)引发异常{
onAccept(类别);
}
}));
}
公共无效设置OnAcceptListener(OnAcceptListener侦听器){
this.listener=listener;
}
AcceptListener上的公共接口{
接收无效(列出类别);
}
}
活动:
public class MainActivity extends AppCompatActivity implements HomeFragment.OnAcceptListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
HomeFragment homeFragment = new HomeFragment();
homeFragment.setOnAcceptListener(this);
}
@Override
public void onAccept(List<Category> categories) {
//update here
}
}
公共类MainActivity扩展AppCompative实现HomeFragment.OnAcceptListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
HomeFragment HomeFragment=新的HomeFragment();
setOnAcceptListener(这个);
}
@凌驾
接受时的公共作废(列出类别){
//在此更新
}
}
Bro getMenu()是从服务器重新加载图片的方法,我可以使用此接口调用该方法而不是传递数据吗@AlazarKomar您不能移动方法,但可以获得返回值。此方法无效,因此没有返回值。您可以在活动中编写getMenu()
。我确实理解您的意思,但如果我在主活动中创建此getMenu(),它将不起作用,因为recyclerview位于fragment@AlazarKomar您可以在片段中创建一个方法,将数据从活动传递到片段,并更新回收器视图。