【问题标题】:Not able to access method in other class (Android Studio)无法访问其他类中的方法(Android Studio)
【发布时间】:2021-10-01 01:21:00
【问题描述】:

我确信这将是一个非常明显的东西,即使盯着代码一个小时后我的愚蠢自己也找不到。

我正在尝试从 HomeActivity 调用 FragmentHome 中的 updateImages 方法。我还在 onCreate 中创建了该类的一个实例,但由于我的原始编码知识,我无法调用它。任何帮助将不胜感激:)

包含上述方法的类:

package com.example.youtubethumbnailapp;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.squareup.picasso.Picasso;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import static android.app.Activity.RESULT_OK;
public class FragmentHome extends Fragment {
    private FragmentHomeListener listener;

    public interface FragmentHomeListener{
        void onInputHomeSent(ArrayList<Uri> input);
    }

    private ImageView video1;
    private ImageView video2;
    private ImageView video3;
    private ImageView video4;
    private ImageView video5;
    private ImageView video6;
    private ImageView video7;
    private ImageView video8;
    private ImageView video9;
    private ImageView video10;
    private ImageView addImageButton;
    public Uri imageUri;
    ArrayList<Uri> uriArrayList = new ArrayList<Uri>();
    ArrayList<ImageView> imageViews = new ArrayList<ImageView>();
    private int imagesSelected = 0;

    @Nullable
    @org.jetbrains.annotations.Nullable
    @Override
    public View onCreateView(@NonNull @org.jetbrains.annotations.NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home,container,false);

        //initialize variables
        video1 = v.findViewById(R.id.video1);
        imageViews.add(video1);
        video2 = v.findViewById(R.id.video2);
        imageViews.add(video2);
        video3 = v.findViewById(R.id.video3);
        imageViews.add(video3);
        video4 = v.findViewById(R.id.video4);
        imageViews.add(video4);
        video5 = v.findViewById(R.id.video5);
        imageViews.add(video5);
        video6 = v.findViewById(R.id.video6);
        imageViews.add(video6);
        video7 = v.findViewById(R.id.video7);
        imageViews.add(video7);
        video8 = v.findViewById(R.id.video8);
        imageViews.add(video8);
        video9 = v.findViewById(R.id.video9);
        imageViews.add(video9);
        video10 = v.findViewById(R.id.video10);
        imageViews.add(video10);
        addImageButton = v.findViewById(R.id.changeViewButton);
        addImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                choosePicture();
            }
        });
        return v;
    }//end of onCreate

    private void choosePicture() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, 1);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==1 && resultCode==RESULT_OK && null != data && data.getData()!=null){
            imageUri = data.getData();
            addPicture();
            uriArrayList.add(imageUri);
            imagesSelected++;
        }
    }

    @Override
    public void onAttach(@NonNull @NotNull Context context) {
        super.onAttach(context);
        if (context instanceof FragmentHomeListener){
            listener = (FragmentHomeListener) context;
        } else {
            throw new RuntimeException(context.toString()
            + "must implement FragmentHomeListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }

//this is the method I want to call
    public void updateImages(ArrayList<Uri> imagesArrayList){
        for (int i = 0; i < imagesArrayList.size(); i++){
            Picasso.get()
                    .load(imagesArrayList.get(i))
                    .fit().centerCrop()
                    .into(imageViews.get(i));
        }
    }

    private void addPicture(){
        Picasso.get()
                .load(imageUri)
                .fit().centerCrop()
                .into(imageViews.get(imagesSelected));
    }

    private void dataSent(){
        listener.onInputHomeSent(uriArrayList);
    }
}

我想从中调用方法的类:

package com.example.youtubethumbnailapp;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class HomeActivity extends AppCompatActivity implements FragmentHome.FragmentHomeListener, FragmentHistory.FragmentHistoryListener, FragmentSuggested.FragmentSuggestedListener {

    private ImageView homeButton;
    private ImageView historyButton;
    private ImageView playButton;

    private Fragment fragmentHome;
    private Fragment fragmentHistory;
    private Fragment fragmentSuggested;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        homeButton = findViewById(R.id.homeButton);
        historyButton = findViewById(R.id.historyButton);
        playButton = findViewById(R.id.playButton);

        fragmentHome = new FragmentHome();
        fragmentHistory = new FragmentHistory();
        fragmentSuggested = new FragmentSuggested();

        switchToFragmentHome();

        homeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchToFragmentHome();
            }
        });
        historyButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchToFragmentHistory();
            }
        });
        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchToFragmentSuggested();
            }
        });

    }//end of onCreate

    public void switchToFragmentHome(){
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.flFragment, fragmentHome).commit();
    }

    public void switchToFragmentSuggested(){
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.flFragment, fragmentSuggested).commit();
    }

    public void switchToFragmentHistory(){
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.flFragment, fragmentHistory).commit();
    }

    @Override
    public void onInputHistorySent(ArrayList<Uri> input) {
        //I want to call it from here
    }

    @Override
    public void onInputHomeSent(ArrayList<Uri> input) {

    }

    @Override
    public void onInputSuggestedSent(ArrayList<Uri> input) {

    }
}

因为我已经实例化了这个类,所以我尝试了 fragmentHome.update 但它没有显示出来。

【问题讨论】:

    标签: java android android-studio android-fragments methods


    【解决方案1】:

    您正在创建片段的新实例。请检查以下代码:

    FragmentHome fragmentHome = new FragmentHome();
    

    你应该这样使用它:

    fragmentHome = new FragmentHome();
    

    【讨论】:

    • 糟糕,我在尝试其他解决方案时不小心把它留在了那里。我主要有fragmentHome = new FragmentHome(); 但是它仍然不允许我访问该方法。谢谢你的回复:)
    【解决方案2】:

    目前,您的updateImages 方法是FragmentHome 类实例的一部分。由于该方法似乎不依赖于任何东西,例如状态,您可以将方法设为静态,如下所示:

    public static void updateImages(//args...){
        // Your method here
    }
    

    HomeActivity内,你可以直接访问这个静态内部方法:

    FragmentHome.updateImages(//args...);
    

    P.S.:目前,您可能会收到 Non-static method 'updateImages()' cannot be referenced from a static context 错误。


    请注意,以这种方式创建和使用updateImages() 并不是一个好的做法。这不是“错误”,但从长远来看效率不高,并且可能导致错误。 (例如,即使您只是将方法声明为静态,您也可能会得到一个NullPointerException,因为updateImages() 包含对imageViews 的引用,这是FragmentHome 中的一个对象,它可能在方法被初始化时尚未初始化调用HomeActivity。)

    如果可能,您应该将独立方法updateImages() 放在单独的实用程序类中,以便您的 UI 代码与您的逻辑代码尽可能分开。这称为“关注点分离”。

    我看到您需要使用 Picasso 将源图像设置为 ImageView。为此,您可以将 ImageView 作为参数传递给方法(免责声明if这对您的用例有意义;if它不会泄漏上下文;等等),因此updateImages() 方法不包含对位于您的FragmentHome 中的imageViews ArrayList 的引用。另请注意,imageViews 目前是私有的,因为您尚未将其声明为公开。 如果您使用此方法,您的updateImages() 或其他方法可以以更高的通用性重复使用。但是,当然,在某些情况下,您只需要一个包装器来封装一个您不能非常通用的方法,这也没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多