如何显示导航栏以打开片段上的链接

时间:2017-07-03 01:40:02

标签: android android-fragments retrofit2 android-navigation-drawer json-api

我想在运行时在导航栏中显示一个列表或某种菜单。我有一个单独的活动,我使用框架布局放置片段。该片段包含Webview。每当用户点击导航项时,webview就会打开其替代链接。我成功收到了Retrofit 2.3的回复,但现在我不知道如何实现这个

public void slow()
{
    print("Shit, spike's got me!");
    StartCoroutine(PauseTheSlowdown(2.1f, .3f, 1));
}
public void Bigslow()
{
    print("HOLY CRAP THAT HURT");
    StartCoroutine(PauseTheSlowdown(3.7f, 0f, 1));
}

IEnumerator PauseTheSlowdown(float seconds, float before, float after)
{
    print("Pause this crap");
    speed = before;
    yield return new WaitForSecondsRealtime(seconds);
    speed = after;
}

我的JSON API看起来像:

            public void onResponse(Call<List<NavBarResult>> call, Response<List<NavBarResult>> response) {
                List<Result> result = response.body();
//what to do here ?
            }
            @Override
            public void onFailure(Call<List<NavBarResult>> call, Throwable t) {
//error messages here
            }

我希望即使我们从API更改数据,所有菜单的项也会自动运行。提前谢谢。

2 个答案:

答案 0 :(得分:1)

可能重复。

Android - Add bottom navigation view dynamically

How can I add a menu dynamically to bottom navigation view?

您可以从导航视图中动态获取菜单,然后添加一个包含JSON响应的新菜单项。

在OnNavigationItemSelectedListener中,您可以更改网页浏览的网址。

编辑1

也许我误会了什么。是否要使用JSON响应填充导航栏?在这种情况下,我上面的链接可以帮助你。

您想使用JSON响应填充导航抽屉吗? 在这种情况下,您应该开始阅读:https://developer.android.com/training/implementing-navigation/nav-drawer.html

修改您的活动布局:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
  • content_frame将包含带有WebView的片段。
  • left_drawer将包含您的动态链接。

获取left_drawer:

mDrawerList = (ListView) findViewById(R.id.left_drawer);

当您获得JSON响应时,只需将适配器设置为mDrawerList:

public void onResponse(Call<List<NavBarResult>> call, Response<List<NavBarResult>> response) {
    // result is a private List<Result> attribute of the class.
    result = response.body();

    // Set the adapter for the list view
    mDrawerList.setAdapter(new ArrayAdapter<Result>(this,
    android.R.layout.simple_list_item_1, result));

    // Set the list's click listener
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
}

这样,您的抽屉布局将动态填充您的JSON响应。

然后,您只需定义OnItemClickListener即可在单击列表中的项目时调用新片段。

private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }
}

MyFragment不是这里的developp,但它包含一个webView并等待一个ARG_LINK,它应该是一个在其webView中显示的URL。

private void selectItem(int position) {
    // Create a new fragment and specify the link to show based on position
    Fragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putString(MyFragment.ARG_LINK, result.get(position).getUrl());
    fragment.setArguments(args);

    // Insert the fragment by replacing any existing fragment
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
                   .replace(R.id.content_frame, fragment)
                   .commit();

    // Highlight the selected item and close the drawer
    mDrawerList.setItemChecked(position, true);
    mDrawerLayout.closeDrawer(mDrawerList);
}

希望这次帮助你!

答案 1 :(得分:0)

您可以在导航抽屉中添加导航视图,然后当您从API接收项目时,您可以将项目添加到菜单中,请参阅下面的代码以添加菜单中的项目。

final Menu menu = navigationView.getMenu();
//Here you should add the length of your json array instead 'i' .
for (int i = 1; i <= 3; i++) {
   menu.add("Runtime item "+ i);
}