有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从一个片段调用另一个片段中的方法

我已经尝试了一段时间(也在这里搜索),当按下其他片段中的按钮时,可以帮助我刷新MainFragment中的listView。谁能告诉我怎么做

下面是函数的main片段(我排除了其他函数,因为我不知道它们是如何贡献的):

public class MainFragment extends Fragment {
public void otherList() {
    SQLite db = new SQLite(getActivity());
    db.open();
    Calendar sCalendar = Calendar.getInstance();
    String day = sCalendar.getDisplayName(Calendar.DAY_OF_WEEK,
            Calendar.LONG, Locale.ENGLISH);
    Cursor c = db.getAllRecords(day);
    Calendar cal = Calendar.getInstance();
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    arrayOfBars.clear();
    if (c.moveToFirst()) {
        do {
            String country = c.getString(0);
            String city = c.getString(1);
            String bar = c.getString(2);
            String timeStart = c.getString(3);

            String[] h = timeStart.split(":");
            int times = Integer.parseInt(h[0]);

            String timeEnd = c.getString(4);
            String[] h2 = timeEnd.split(":");
            int timee = Integer.parseInt(h2[0]);

            String placeLaLo = c.getString(5);
            String description = c.getString(6);
            String likes = c.getString(7);
            String offer = c.getString(8);

            if (hour < (times + 1) || hour < (timee)) {
                getPrefs = PreferenceManager
                        .getDefaultSharedPreferences(MainFragment.this
                                .getActivity());
                boolean lay = getPrefs.getBoolean("boolean", false);
                if (lay == true) {
                    while (times < timee) {
                        timeStart = times + ":" + h[1];
                        times++;
                        timeEnd = times + ":" + h2[1];
                        arrayOfBars.add(new BarObject(country, city, bar,
                                timeStart, timeEnd, placeLaLo, description,
                                likes, offer, bar));
                    }
                } else {
                    arrayOfBars.add(new BarObject(country, city, bar,
                            timeStart, timeEnd, placeLaLo, description,
                            likes, offer, bar));
                }
            }

        } while (c.moveToNext());

        Collections.sort(arrayOfBars, new BarObject.CompST());

        lv2.setAdapter(null);
        adapter = new BarAdapter(getActivity(), arrayOfBars);
        lv2.setAdapter(adapter);
    } else {
        Toast.makeText(getActivity(), "No database found",
                Toast.LENGTH_LONG).show();
    }
    db.close();
}

}

这是另一个片段:

public class SocialMedia extends Fragment {
ImageButton facebook, twitter, layoutS;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.social_media, container, false);
    layoutS = (ImageButton) view.findViewById(R.id.ibLayout);

    layoutS.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SharedPreferences getPrefs = PreferenceManager
                    .getDefaultSharedPreferences(SocialMedia.this
                            .getActivity());
            boolean lay = getPrefs.getBoolean("boolean", false);
            SharedPreferences.Editor e = getPrefs.edit();
            lay = !lay;
            e.putBoolean("boolean", lay);
            e.commit();
                            //Here I want to call otherList() from MainFragment
        }
    });
    return view;
}

}


共 (5) 个答案

  1. # 1 楼答案

                // Calling Parent Fragment method from Child Fragment.
            // Child Fragment
            AppCompatActivity activity = (AppCompatActivity) view.getContext();
            FragmentManager fragmentManager = activity.getSupportFragmentManager();
            NavigateFragment navigateFragment = (NavigateFragment) fragmentManager.findFragmentById(R.id.fragment_place_dashboard);
            navigateFragment.sayHelloWorld();
    
    
            // -- Some method in Parent Fragment(NavigateFragment).
            public void sayHelloWorld(){
                Log.d(TAG, "Hello World.");
            }
    
  2. # 2 楼答案

    你应该用interface来做这个。在OtherFragment类中定义一个interface并在MainActivity中实现,在MainFragment中定义一个public方法来刷新ListView并从MainActivity调用该方法。下面是一个例子:

    public Class OtherFragment extends Fragment implements OnClickListener {
    
    private Communicator communicator;
    
       ...
    
    public void setCommunicator(Communicator communicator) {
        this.communicator = communicator;
    }
    
    @Override
    public void onClick(View v) {
       communicator.clicked();
    }
    
       public interface Communicator {
          public void clicked();
       }
    }
    

    在你的MainActivity中:

    public class MainActivity extends Activity implements OtherFragment.Communicator {
    
       MainFragment mainFragment;
    
       @Override
       protected void onCreate(Bundle b) {
          ...
          OtherFragment otherFragment = new OtherFragment();
          otherFragment.setCommunicator(this);
          ...
       }
    
       ...
    
       @Override 
       public void clicked() {
         mainFragment.updateList();
       }
    }
    

    在你的MainFragment中:

    public class MainFragment extends Fragment {
    
        ...
    
        public void updateList() {
            // update list
        }
    }
    
  3. # 3 楼答案

    要从另一个对象(片段是一个对象)调用方法,需要有该对象的引用。因此,如果您想从SocialMedia实例调用MainFragment#otherList(),那么SocialMedia需要对MainFragment的引用

    例如:

    public class SocialMedia {
    
        private MainFragment mainFragment = null;
    
        public void setMainFragment(final MainFragment mainFragment) {
            this.mainFragment = mainFragment
        }
    }
    

    然后你可以使用this.mainFragment.otherList()

  4. # 4 楼答案

    在MainFragment类中,可以执行以下代码:

    private static MainFragment instance = null;
    
    @Override  
    public void onCreate(@Nullable Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        instance = this;  
    }
    
    public static MainFragment getInstance() {  
        return instance;  
    } 
    

    在SocialMedia类中,可以按如下方式调用该方法:

    MainFragment.getInstance().otherList();   
    
  5. # 5 楼答案

    FragmentManager fm = getFragmentManager(); 
    MainFragment fragm = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
    fragm.otherList(); 
    

    这个代码最适合我。看起来很容易