根据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>
主图看起来像这样,以起始位置为起始目标,并与一个动作连接到详细片段(此动作是通过按钮触发的),并且使用嵌套图实现了条件导航:
我将此嵌套图称为welcomeGraph,它包括用于登录或注册的屏幕,您可以在此处看到它:
在homeFragment onResume中,我检查登录/注册是否已完成(由sharedPrefs中存储的虚拟布尔值确定),如果不是,则启动用于注册/登录的欢迎嵌套图。
在登录目标中,我有一个“已完成”按钮,该按钮将sharedPrefs中的虚拟布尔值设置为true,并触发动作popToWelcomeGraph(包括该操作),该操作应关闭整个嵌套图并将我带回到homeFragment(此方法有效)。
问题-嵌套图中的工具栏问题:
由于“欢迎”图是在用户进入应用程序后立即启动的,因此工具栏不应在该嵌套图的第一个目标位置显示后退/上箭头,而应该感觉好像它是应用程序中的第一个屏幕,然后点按一下即可退出该应用。
问题:是否可以更改此处的工具栏,以模拟嵌套图中的第一个屏幕是应用程序中的第一个屏幕,直到登录/注册完成?这会是个坏习惯吗?
答案 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)
这样,后退按钮将不会显示在顶层片段上。