导航组件:条件导航中的工具栏问题

时间:2018-08-20 17:17:52

标签: android android-architecture-navigation

根据navigation priciples,应用程序中的第一个目标应该是用户在注册/登录或任何其他条件导航后启动应用程序时通常看到的屏幕,我将其称为启动目标“ homeFragment”。

遵循这一原则,并阅读了conditional navigation by Maria Neumayer上的文章后,在有条件的导航流程中,我遇到了工具栏和后向导航的一些问题。

我正在使用一个带有ConstraintLayout,工具栏和NavHostFragment的单个活动来构建应用程序:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.activities.NavigationTestActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"
        />

</android.support.constraint.ConstraintLayout>

主图看起来像这样,以起始位置为起始目标,并与一个动作连接到详细片段(此动作是通过按钮触发的),并且使用嵌套图实现了条件导航:

Main Graph

我将此嵌套图称为welcomeGraph,它包括用于登录或注册的屏幕,您可以在此处看到它:

Welcome Nested Graph

在homeFragment onResume中,我检查登录/注册是否已完成(由sharedPrefs中存储的虚拟布尔值确定),如果不是,则启动用于注册/登录的欢迎嵌套图。

在登录目标中,我有一个“已完成”按钮,该按钮将sharedPrefs中的虚拟布尔值设置为true,并触发动作popToWelcomeGraph(包括该操作),该操作应关闭整个嵌套图并将我带回到homeFragment(此方法有效)。

问题-嵌套图中的工具栏问题:

由于“欢迎”图是在用户进入应用程序后立即启动的,因此工具栏不应在该嵌套图的第一个目标位置显示后退/上箭头,而应该感觉好像它是应用程序中的第一个屏幕,然后点按一下即可退出该应用。

问题:是否可以更改此处的工具栏,以模拟嵌套图中的第一个屏幕是应用程序中的第一个屏幕,直到登录/注册完成?这会是个坏习惯吗?

2 个答案:

答案 0 :(得分:0)

您必须实现如下所示的通信器接口

requestheader

并将其实施到您的活动类中,如下所示

interface ActivityCommunicator {
    void alterToolbar();
}

}

在您的片段中,您可以像下面这样称呼

class HomeActivity extends AppCompatActivity implements ActivityCommunicator {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Activity code
}

@Override
public void alterToolbar() {
    ActionBar actionBar = getSupportActionBar();
    // False to hide back button and true to show it
    actionBar.setDisplayHomeAsUpEnabled(false);
}

}

您可以根据需要更改alterToolbar()实现

答案 1 :(得分:0)

我最近通过创建AppBarConfiguration并使用该配置设置工具栏解决了此问题。 AppBarConfiguration接受顶级目标ID作为参数。话虽如此,您可以做

def screenshotvideo(url, interval, id, fullduration, title, quality):
    interval = int(interval)
    parsed_t = isodate.parse_duration(fullduration)
    durationseconds=parsed_t.total_seconds()
    iterat=int(durationseconds/int(interval))
    for i in range(0, iterat):
        print(str(id))
        print(str(i))
        print(str(i*interval))
        part(url, time.strftime('%H:%M:%S', time.gmtime(int(i*interval))), "00:00:01", title+"-"+str(id), quality, i)


def part(url, starttime, duration, name, quality, i):
    f = os.popen("ffmpeg $(youtube-dl -f "+quality+" -g '"+url+"' | sed 's/.*/-ss "+starttime+" -i &/') -t "+duration+" -c:v libx264 "+name+".mp4")
    now = f.read()
    print(now)
    f = os.popen("ffmpeg -i "+name+".mp4 -ss 00:00:00 -vframes 1 "+name+"_"+str(i)+".jpg")
    now = f.read()
    print(now)
    f = os.popen("rm -rf "+name+".mp4")
    now = f.read()
    print(now)

这样,后退按钮将不会显示在顶层片段上。