Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从活动访问片段方法中的方法_Java_Android - Fatal编程技术网

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您可以在片段中创建一个方法,将数据从活动传递到片段,并更新回收器视图。