【问题标题】:Android opening specific tab fragment on notification clickAndroid在通知点击时打开特定的标签片段
【发布时间】:2013-05-04 03:56:38
【问题描述】:

我有一个使用操作栏选项卡的 android 应用程序。还有一个通知系统。

我想在单击通知时直接打开特定选项卡。如何做到这一点(因为通知待处理意图只能打开活动,而我的主要活动包含 3 个标签的 3 个片段)?

以下是标签的主要活动代码。

    public class MaintabActivity extends Activity {
public static Context appContext;
public static MapView mMapView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainsc);
    appContext = getApplicationContext();

    startService(new Intent(this, MyService.class));


   //ActionBar
    ActionBar actionbar = getActionBar();
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab ChatTab = actionbar.newTab().setText("Chat");
    ActionBar.Tab MapsTab = actionbar.newTab().setText("Maps");
    ActionBar.Tab SplashTab=actionbar.newTab().setText("Splash");

    Fragment ChatFrag = new ChatActivity();
    MapActivity mMapFragment = MapActivity.newInstance();
    Fragment SplashFrag = new SplashActivity();


    ChatTab.setTabListener(new MyTabsListener(ChatFrag));
    MapsTab.setTabListener(new MyTabsListener(mMapFragment));
    SplashTab.setTabListener(new MyTabsListener(SplashFrag));

    actionbar.addTab(ChatTab);
    actionbar.addTab(MapsTab);
    actionbar.addTab(SplashTab);

}




@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
}

    }

    class MyTabsListener implements ActionBar.TabListener {
public Fragment fragment;

public MyTabsListener(Fragment fragment) {
    this.fragment = fragment;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    Toast.makeText(MaintabActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show();
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.replace(R.id.fragment_container, fragment);
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.remove(fragment);
}

    }

这是显示通知的服务代码。

    private void showNotification() {

        CharSequence text = getText(R.string.local_service_started);

        // Set the icon, scrolling text and timestamp
        Notification notification = new Notification(R.drawable.ic_launcher, text,
                System.currentTimeMillis());

        // The PendingIntent to launch our activity if the user selects this notification
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, MaintabActivity.class), 0);

        // Set the info for the views that show in the notification panel.
        notification.setLatestEventInfo(this, getText(R.string.local_service_label),
                       text, contentIntent);

        // Send the notification.
        mNM.notify(NOTIFICATION, notification);
    }

【问题讨论】:

  • @user2319636-发布一些代码。
  • 代码是什么?它的常规操作栏选项卡,我想在单击通知时打开假设选项卡 B。
  • user2319636-当您点击通知时,它会调用您包含选项卡的活动,您可以通过此--viewPager.setCurrentItem(position); 调用 viewPager 中的特定片段;
  • 如果有两种不同类型的通知,我想打开不同的标签怎么办? Activity 如何知道点击了哪个通知?
  • @user2319636-为此,您可以通过通知传递选项卡位置......这样当调用活动时,它将根据视图寻呼机中片段的位置显示......发布一些代码以便我可以帮助你。

标签: android android-fragments android-actionbar android-notifications


【解决方案1】:

传递指定选项卡以打开的操作,以及待处理意图中的意图。并在您的活动检索操作(请参阅getIntent())中传递并基于它,打开一个特定的选项卡。

Intent intent = new Intent(this, Home.class);
intent.setAction("OPEN_TAB_1");
PendingIntent pending intent = PendingIntent.getService(this, 0, intent, 0);              

// In OnCreate() or depending on implementation  
if(getIntent().getAction().equals("OPEN_TAB_1") {
     // Open Tab
}

【讨论】:

  • 调用ActionBar的selectTab()方法
  • 如果您使用的是 ActionBar (android.support.v7.app),请致电 actionBar.setSelectedNavigationItem(YOUR_TAB_ORDER_ID);
【解决方案2】:

在这里找到我的答案:Launch a fragment in my Android application from the notification bar。我认为这与将extras 添加到您的Intent 并没有太大区别,但是使用Androidaction-idea 很好。

将操作发送到您的通知函数:

public static void notify(Context context, String message, String  action) {

    action = action.toUpperCase();

    //...

    Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());

    if(action != null && launchIntent != null){         
        launchIntent.setAction(action);         
    }

    PendingIntent pendingIntent = PendingIntent.getActivity(context, -1, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notification.when = System.currentTimeMillis();  
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 

    // Set the notification and register the pending intent to it
    notification.setLatestEventInfo(context, appName, message, pendingIntent);

    // Trigger the notification
    notificationManager.notify(0, notification);
}

然后获取动作并启动相应的片段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多