fragment添加menu 以及 fragment中调用onActivityResult

这篇博客介绍了如何在Fragment中添加Menu,并详细说明了Fragment如何与Activity进行onActivityResult交互,特别是在Activity含有ViewPager并切换多个Fragment的场景下,重点强调了setHasOptionsMenu(true)和在Activity中正确处理onActivityResult的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中,经常能遇到,Activity中放ViewPager,ViewPager里面放几个fragment来切换,然后Activity中的菜单项需要能够更改fragment里面的信息。

整理出如下代码:

1.Activity代码如下:

public class AAActivity extends BaseActivity{

	private ViewPager viewPager;
	private AgentMomentPagerAdapter pagerAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_agent_moment);
		viewPager = (ViewPager) findViewById(R.id.pager_agent_moment);

		pagerAdapter = new PagerAdapter(this, getSupportFragmentManager());
		viewPager.setAdapter(pagerAdapter);
		viewPager.setCurrentItem(0);
		viewPager.setOffscreenPageLimit(0);
		
	}

	@Override
	protected void onResume() {
		super.onResume();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(this.getString(R.string.search))
		.setIcon(R.drawable.ic_search);
		MenuItemCompat.setShowAsAction(menu.getItem(0), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
		
		menu.add(this.getString(R.string.send))
		.setIcon(R.drawable.ic_send);
		MenuItemCompat.setShowAsAction(menu.getItem(1), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
		
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		String title = item.getTitle().toString();
		if(title.equals(getString(R.string.search))){
			Intent it = new Intent(AAActivity.this,a0.class);
			startActivity(it);
		}else if(title.equals(getString(R.string.send))){
			Intent intent = new Intent(AAActivity.this, a1.class);
			startActivity(intent);
		}else
			return super.onOptionsItemSelected(item);//这句也要,不然左上角那个返回键不会退出当前页面
		
		return false;
	}

	@Override 
	protected void onActivityResult(int requestCode, int resultCode, Intent data)  {  
		super.onActivityResult(requestCode, resultCode, data);//这里一定要,不然代码走不到fragment中的onActivityResult
	}
}

2.fragment代码如下:


public class AAFragment extends Fragment {

	public static AAFragment newInstance() {
		AAFragment fragment = new AAFragment();
		return fragment;
	}
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);//importent
    }
	
	@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
        menu.add(this.getString(R.string.more))
		.setIcon(R.drawable.ic_more);
		MenuItemCompat.setShowAsAction(menu.getItem(2), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
    }
	
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data)  {  

		super.onActivityResult(requestCode, resultCode, data);
			if(requestCode == 11){
				//do something
			}

	}
      
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
    	if(item.getTitle().equals(getString(R.string.more))){
    		Intent intt = new Intent(getActivity(),ActionbarNoPicDialogActivity.class);
    		startActivityForResult(intt,11);/注意:这里不能使用getActivity().startActivityForResult()接口
    		return true;
    	}
        return super.onOptionsItemSelected(item);
    }

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View rootView = inflater.inflate(R.layout.fragment_agent_moment_list, null);
		
		return rootView;
	}
}

3.PagerAdapter代码如下:

public class PagerAdapter extends FragmentPagerAdapter {
	private Fragment[] fragments;
	private Integer[] titles;
	private Context mCtx;

	public PagerAdapter(Context ctx, FragmentManager fm) {
		super(fm);		
		this.mCtx = ctx;
		fragments = new Fragment[2];
		fragments[0] = AAFragment.newInstance();
		fragments[1] = ABFragment.newInstance();
		titles = new Integer[]{R.string.string_all, R.string.string_little};
	}

	@Override
	public Fragment getItem(int position) {
		// TODO Auto-generated method stub
		return fragments[position];
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return fragments.length;
	}
	
	public int getTittle(int position){
		return titles[position];
	}
	
	@Override  
    public CharSequence getPageTitle(int position){
         return mCtx.getText(titles[position]);
    }

}

总结:

fragment添加menu最重要的是在fragment中的OnCreate()中使用setHasOptionsMenu(true);

fragment使用onActivityResult()时最重要是在Activity中使用super.onActivityResult(),




package com.lc.bailingbird; import static com.lc.bailingbird.base.BaseApplication.Blistener; import static com.lc.bailingbird.base.BaseApplication.bluetoothSDK; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentResultListener; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; import com.bes_ota.bluetoothsdk.BluetoothSDK; import com.google.android.material.badge.BadgeDrawable; import com.lc.bailingbird.base.BaseActivity; import com.lc.bailingbird.base.BaseApplication; import com.lc.bailingbird.conn.BaseAsyCallBack; import com.lc.bailingbird.conn.CartListPost; import com.lc.bailingbird.databinding.ActivityMainBinding; import com.lc.bailingbird.dialog.CommonDialog; import com.lc.bailingbird.fragment.ChatFragment; import com.lc.bailingbird.fragment.HomeFragmentNew; import com.lc.bailingbird.fragment.MarketFragment; import com.lc.bailingbird.fragment.MineFragment; import com.lc.bailingbird.fragment.MyFragment; import com.lc.bailingbird.fragment.NewsFragment; import com.lc.bailingbird.home.GoodDetailActivity; import com.lc.bailingbird.home.NewcomerGuideActivity; import com.lc.bailingbird.home.WebActivity; import com.lc.bailingbird.home.launcherActivity; import com.lc.bailingbird.login.ForgetPWDActivity; import com.lc.bailingbird.login.LoginActivity; import com.lc.bailingbird.login.RegisterActivity; import com.lc.bailingbird.mine.WelcomeActivity; import com.lc.bailingbird.util.BluetoothUtil; import com.lc.bailingbird.util.GlideImageLoader; import com.lc.bailingbird.util.SPManager; import com.mob.MobSDK; import com.petterp.floatingx.FloatingX; import com.petterp.floatingx.assist.FxGravity; import com.petterp.floatingx.assist.helper.AppHelper; import com.petterp.floatingx.impl.lifecycle.FxTagActivityLifecycleImpl; import com.qiyukf.nimlib.sdk.StatusBarNotificationConfig; import com.qiyukf.unicorn.api.ConsultSource; import com.qiyukf.unicorn.api.OnMessageItemClickListener; import com.qiyukf.unicorn.api.Unicorn; import com.qiyukf.unicorn.api.YSFOptions; import com.qiyukf.unicorn.ui.activity.LeaveMessageActivity; import com.qiyukf.unicorn.ui.activity.ServiceMessageActivity; import com.tencent.bugly.crashreport.CrashReport; import com.zcx.helper.view.toast.ToastUtils; public class MainActivity extends BaseActivity<ActivityMainBinding> { FragmentStateAdapter adapter; // boolean ISCLICK = true; // CommonDialog dialog; @Override protected void iniClick() { getSupportFragmentManager().setFragmentResultListener("position", this, new FragmentResultListener() { @Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle result) { Log.e("HOME_TAG", "滑动?" + result.getInt("position")); binding.viewpager.setCurrentItem(result.getInt("position"), true); if (result.getInt("position") == 1 && result.containsKey("title")) { getSupportFragmentManager().setFragmentResult("classTitle", result); } } }); } @Override public void iniView() { super.iniView(); // dialog = new CommonDialog(MainActivity.this, "提示", "客服功能需要麦克风权限"); binding.viewpager.setAdapter(adapter = new FragmentStateAdapter(this) { @NonNull @Override public Fragment createFragment(int position) { switch (position) { case 0: return new NewsFragment(); case 1: return new MarketFragment(); case 2: return new HomeFragmentNew(); case 3: return new ChatFragment(); default: return new MineFragment(); } } @Override public int getItemCount() { return 5; } }); binding.viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { super.onPageSelected(position); switch (position) { case 0: binding.tab.setSelectedItemId(R.id.menu_news); break; case 1: binding.tab.setSelectedItemId(R.id.menu_market); break; case 2: binding.tab.setSelectedItemId(R.id.menu_home); break; case 3: binding.tab.setSelectedItemId(R.id.menu_message); break; case 4: binding.tab.setSelectedItemId(R.id.menu_my); break; } } }); // binding.tab.setSelectedItemId(R.id.menu_home); binding.tab.setOnItemSelectedListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.menu_news) { binding.viewpager.setCurrentItem(0, true); return true; } else if (itemId == R.id.menu_market) { binding.viewpager.setCurrentItem(1, true); return true; } else if (itemId == R.id.menu_home) { binding.viewpager.setCurrentItem(2, true); return true; } else if (itemId == R.id.menu_message) { if (!SPManager.get().getLoginStatus()) { LoginActivity.start(this); return false; } binding.viewpager.setCurrentItem(3, true); return true; } else if (itemId == R.id.menu_my) { if (!SPManager.get().getLoginStatus()) { LoginActivity.start(this); return false; } binding.viewpager.setCurrentItem(4, true); return true; } return false; }); } @Override protected void onDestroy() { super.onDestroy(); // EventBus.getDefault().unregister(this); } public void setPrivate() { MobSDK.submitPolicyGrantResult(true); CrashReport.initCrashReport(getApplicationContext(), "2a231036be", false); } @Override protected void onResume() { super.onResume(); getCartNum(); } public void getCartNum() { new CartListPost(new BaseAsyCallBack<CartListPost.RespBean>(MainActivity.this) { @Override protected void onStart() { super.onStart(); } @Override protected void onSuccess(String toast, CartListPost.RespBean bean) { BadgeDrawable badge = binding.tab.getOrCreateBadge(R.id.menu_message); if (bean.getResult().isEmpty()) { binding.tab.removeBadge(R.id.menu_message); } else { if (bean.getResult().size() > 0) { badge.setVisible(true); badge.setVerticalOffset(10); badge.setNumber(bean.getResult().get(0).getList().size()); badge.setBackgroundColor(Color.parseColor("#F30B14")); badge.setBadgeTextColor(Color.parseColor("#FFFFFF")); badge.setMaxCharacterCount(99); } else { binding.tab.removeBadge(R.id.menu_message); } } } @Override protected void onFail(String toast) { ToastUtils.show(toast); } @Override protected void onEnd(String toast) { super.onEnd(toast); } }).execute(false); } private long mExitTime; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if ((System.currentTimeMillis() - mExitTime) > 2000) { ToastUtils.show("再按一次退出APP"); mExitTime = System.currentTimeMillis(); } else { //后台运行 不结束程序 只是退出到后台 Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN"); intent.addCategory("android.intent.category.HOME"); startActivity(intent); //System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出 结束程序 } return true; } return super.onKeyDown(keyCode, event); } } 怎么在ViewPager滑动的时候添加是否登录验证
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值