标签: android-navigation

Android:使用navigateUpFromSameTask()时的错误转换

我刚刚开始使用Android,我按照本指南将向上导航添加到操作栏上的活动.

http://developer.android.com/training/implementing-navigation/ancestral.html

然而,当我使用动作栏中的向上按钮时,它的转换使其显示为打开新活动的淡入过渡,而不是它应该的淡出,就像按下按钮上的后退按钮时一样.底部.

我该怎么做才能让它显示正确的过渡?谢谢.

android android-navigation

11
推荐指数
3
解决办法
3037
查看次数

导航抽屉不关闭

我的应用中的导航抽屉没有关闭.我正在使用活动而不是碎片.当我点击其中的任何项目时listview,它会打开其他活动,但是当我回去时,抽屉仍然打开.我尝试过使用DrawerLayout.closeDrawers();但它没有用.如何关闭导航抽屉?
这是我的代码:

Java的

public class MainActivity extends FragmentActivity {
final String[] data ={"Aluminium","Gold","Zinc"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);

    final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
    final ListView navList = (ListView) findViewById(R.id.left_drawer);
    navList.setAdapter(adapter);
    navList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int pos,long id){

            switch (pos){
                case 0:
                    Intent i = new Intent(MainActivity.this,Aluminium.class);
                    startActivity(i);
                    break;
                case 1:
                    Intent i2 = new Intent(MainActivity.this,Gold.class);
                    startActivity(i2);
                    break;
                case 2:
                    Intent …
Run Code Online (Sandbox Code Playgroud)

android android-navigation

11
推荐指数
3
解决办法
2万
查看次数

此NavController不知道操作

我以两种不同的方式提供片段之间的数据传输,首先是正常工作,而安全的数据类型会导致运行时崩溃。我正在使用该Android文档:https : //developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args

不明白如何解决该问题。谢谢你的帮助

07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:669)
    at androidx.navigation.NavController.navigate(NavController.java:628)
    at androidx.navigation.NavController.navigate(NavController.java:690)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.makeTransfer(InitialFragment.java:58)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.lambda$onViewCreated$0(InitialFragment.java:47)
    at com.flexdecision.ak_lex.navigationsimple.-$$Lambda$InitialFragment$shEoLbIe0sVhbTcJ2Al_FvBuU7g.onClick(lambda)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)

导航图:

07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:669)
    at …
Run Code Online (Sandbox Code Playgroud)

java android android-navigation android-architecture-components android-jetpack

11
推荐指数
2
解决办法
9671
查看次数

Android和Deep Links中的多个导航图

我有3个活动:主要,登录,向导.

对于每个Activity,我都有单独的导航图和片段目的地.

主导航图还具有登录活动目的地,以便在注销时启动登录屏幕.

Action.MAIN启动器意图启动时,应用程序似乎正常工作.

但是在使用Deep Link时遇到问题.我想将URI添加到Login Nav Graph(更改密码片段).此导航图使用单独的NavHostFragment.我用过2种方法.

  1. 在登录导航图中直接添加深层链接到更改密码片段目的地 - >深层链接仅导航到START DESTINATION(登录片段目的地).这里也退回按钮不能正常工作,即完成应用程序而不是返回主导航图主要目的地.
  2. 将Deep Link添加到Login Activity Destinationin Main Nav Graph和again,这里Back按钮确实正常工作,我按预期登陆Login Fragment Destination.但在这里我想手动导航到更改密码片段目的地,我遇到另一个问题,即Intent Action.View与Uri数据不会传递到此登录活动目的地.它仅传递给主要活动,主要活动主持人.

总结一下.我认为由活动目的地连接的多个导航图之间的深层链接行为不能正常工作.我不知道是否有任何解决方案.

我能以某种方式从NavController检索Deep Link Arguments(Uri数据)吗?或者唯一的解决方案是从getIntent().data获取它?在这里,正如我所说,这个Intent不会转发到最终目标Activity,而只会转移到创建的Activities堆栈中的第一个Activity.

现在我回到手动处理没有Android导航架构的Deep Links,因为如果有比单个Nav Graph更复杂的导航结构,单个Activity并且只有内部Fragment导航,它似乎毫无用处.

android deep-linking android-navigation

11
推荐指数
1
解决办法
1206
查看次数

弹出片段后的多个LiveData观察者

问题

摘要:导航到新片段,弹出新片段并返回到原始片段后,片段中会触发多个LiveData 观察器.

详细信息:该体系结构由MainActivity组成,MainActivityHomeFragment作为MainActivity 导航图中起始目标.HomeFragment中是一个以编程方式夸大的PriceGraphFragment.该HomeFragment使用导航组件,推出一个新的子片段ProfileFragment.在背面按下,弹出ProfileFragment,应用程序返回到托管PriceGraphFragment的HomeFragment.PriceGraphFragment是多次调用Observer的地方.

我正在记录Observer发出的HashMap的哈希码,当我转到配置文件片段时,它会显示2个唯一的哈希码,弹出配置文件Fragment,然后返回价格片段.当我在不启动配置文件Fragment的情况下旋转屏幕时,这与从HashMap看到的一个哈希码相反.

履行

  1. 导航组件在HomeFragment中启动新的ProfileFragment.

    view.setOnClickListener(Navigation.createNavigateOnClickListener( R.id.action_homeFragment_to_profileFragment, null))

  2. 在Fragment中创建ViewModel(PriceGraphFragment).已记录ViewModel,并且具有多个Observers的数据仅在ViewModel中初始化一次数据.

    override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) priceViewModel = ViewModelProviders.of(this).get(PriceDataViewModel::class.java) }

  3. 从原始Fragment(PriceGraphFragment)中的ViewModel中侦听数据.这被多次调用,但是只有在加载Fragment时才会有一个Observer.

    priceViewModel.graphLiveData.observe( this, Observer { priceGraphDataMap: HashMap<Exchange, PriceGraphLiveData>? -> // This is being called multiple times. })

试图解决方案

  1. onCreate()方法中创建FragmentViewModel. priceViewModel = ViewModelProviders.of(this).get(PriceDataViewModel::class.java)
  2. 使用Fragment的活动和子Fragment的父Fragment创建ViewModel.
    priceViewModel = ViewModelProviders.of(activity!!).get(PriceDataViewModel::class.java)

    priceViewModel = ViewModelProviders.of(parentFragment!!).get(PriceDataViewModel::class.java) …

android android-fragments kotlin android-navigation android-livedata

11
推荐指数
2
解决办法
8245
查看次数

重新选择底部导航选项卡后Android清除后退堆栈

将最新的导航组件与 一起使用BottomNavigationViewNavController现在默认保存和恢复选项卡的状态:

作为此更改的一部分,onNavDestinationSelected()、BottomNavigationView.setupWithNavController() 和 NavigationView.setupWithNavController() 的 NavigationUI 方法现在会自动保存和恢复弹出目的地的状态,从而无需更改任何代码即可支持多个返回堆栈。当使用带有片段的导航时,这是与多个返回堆栈集成的推荐方法。

这很棒!现在,切换选项卡将为您提供最后查看的堆栈。

但是,如果用户重新选择一个选项卡,假设他们已经离开Home -> Detail Page A -> Detail Page B,然后他们选择Home希望返回到默认视图的选项卡,他们仍然会看到Detail Page B

似乎讨论的一部分是处理问题跟踪器中提到的“重新选择选项卡”行为,但我无法找出实现此目的的推荐方法。

NavigationAdvancedSample中包含的所有内容是:

val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)
bottomNavigationView.setupWithNavController(navController)

// Setup the ActionBar with navController and 3 top level destinations
appBarConfiguration = AppBarConfiguration(
        setOf(R.id.titleScreen, R.id.leaderboard,  R.id.register)
    )
setupActionBarWithNavController(navController, appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)

这只是恢复之前的状态,如发行说明中所述。

我们如何检查是否再次点击导航栏项目并清除后堆栈?

android android-navigation bottomnavigationview android-bottomnav android-architecture-navigation

11
推荐指数
3
解决办法
7106
查看次数

添加资产文件夹后导航中出现“错误:R 包不存在”:Android Studio

自从将 Assets 文件夹添加到我的项目后,我现在得到:

error: package R does not exist
"return new ActionOnlyNavDirections(R.id.action_newAlarmFragment_to_homeFragment);"
Run Code Online (Sandbox Code Playgroud)

这是来自此自动生成的代码:

import androidx.annotation.NonNull;
import androidx.navigation.ActionOnlyNavDirections;
import androidx.navigation.NavDirections;

public class SetNewAlarmFragmentDirections {
  private SetNewAlarmFragmentDirections() {
  }

  @NonNull
  public static NavDirections actionNewAlarmFragmentToHomeFragment() {
    return new ActionOnlyNavDirections(R.id.action_newAlarmFragment_to_homeFragment);
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试清理和重建项目,并尝试按照评论中的建议“使缓存无效并重新启动”

浏览这里的其他回答的问题,似乎它可能是 R. 的导入导致了这个问题,但我找不到任何东西..

NavDirection 本身来自这个片段:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CompoundButton
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.Navigation
import com.pleavinseven.alarmclockproject.alarmmanager.AlarmManager
import com.pleavinseven.alarmclockproject.data.model.Alarm
import com.pleavinseven.alarmclockproject.data.viewmodel.AlarmViewModel
import com.pleavinseven.alarmclockproject.databinding.FragmentSetNewAlarmBinding
import com.pleavinseven.alarmclockproject.util.TimePickerUtil
import java.util.*


class SetNewAlarmFragment : Fragment() {

    private val timePickerUtil …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-studio android-navigation

11
推荐指数
1
解决办法
3717
查看次数

如何组合导航抽屉和微调器[如在Google+应用程序中]

我需要你的建议.在Google+ App for Android中,有两个元素,我不知道如何组合在一起.一个是" 导航抽屉 ",第二个是" Action Bar Navigation Spinner ".你知道这两个元素是如何组合在一起的吗?

非常感谢您的建议!PS我知道,我很蹩脚:)(我为我的英语道歉) Google+应用程序(NavDrawer和Spinner的组合)

android android-actionbar android-navigation

10
推荐指数
1
解决办法
1万
查看次数

如何在构建时使用占位符和导航组件创建深度链接

我们有一个使用 Deeplinks 的应用程序。我们还使用了 Android 导航组件。

目前我们在导航.xml 文件中配置我们的深层链接,这工作正常,但我们现在需要能够在构建时根据设置的环境变量添加另一个深层链接。

  • 我尝试在 build.gradle 中设置 String 资源并在 navigation.xml 中引用这些资源。

  • 我还尝试在 navigation.xml 中设置占位符,但无法替换它,因为它已被解析为 URI。

  • 我还尝试在 Manifest 中使用占位符设置直接意图过滤器,这会起作用,但我们失去了来自导航组件的良好路由。

目前,我们在 out navigation.xml 文件中以以下形式配置我们的 Deeplinks:

 <deepLink
            android:autoVerify="true"
            app:uri="foo.bar.baz/pull/{quxArg}/{quuxArg}" />
Run Code Online (Sandbox Code Playgroud)

我们现在需要能够在构建时基于一组 Envar 创建额外的 Deeplink。

例子:

DEEPLINK_ENVAR = "replacement.com"

构建.gradle:

manifestPlaceholders = [deeplink:DEEPLINK_ENVAR]
Run Code Online (Sandbox Code Playgroud)

导航.xml:

<deepLink
            android:autoVerify="true"
            app:uri="${deeplink}/pull/{quxArg}/{quuxArg}" />
Run Code Online (Sandbox Code Playgroud)

请注意,以上方法无效。

如果这只是 Manifest 中的一个意图过滤器,我们可以使用 Manifest 占位符来完成此任务并在 app.gradle 中设置它们。然而,navigation.xml 中设置的深层链接被解析为 URI,并在替换之前销毁所有占位符。

有没有人尝试过类似的事情?我试图避免必须运行预构建脚本来直接模板化导航文件。

期望的结果:

我希望能够在构建时添加一个额外的深层链接(实际上 4 个到不同的目的地),同时使用 Android 导航组件。

android placeholder android-navigation android-deep-link

10
推荐指数
1
解决办法
1097
查看次数

如何使用Android导航组件将值传递回之前的片段目的地?

让坐吧 我有一些这样的目的地

从片段 A --> 到片段 B --> 到片段 C

我可以使用 Safe Args 将数据从片段 A 传递到片段 B,也可以使用从片段 B 到片段 C 的安全参数。

如果我想将片段 C 中生成的字符串带回片段 B 或片段 A 怎么办?

要从片段 C 导航到片段 B,我使用代码:

Navigation.findNavController(fragmentView).navigateUp()
Run Code Online (Sandbox Code Playgroud)

并从片段 C 导航到片段 A,我使用代码:

Navigation.findNavController(view).popBackStack(R.id.fragmentA, false)
Run Code Online (Sandbox Code Playgroud)

那么如何将值传递回之前的片段目的地?我是否必须从片段 C 返回到片段 B 并通过安全参数传递值?

真的需要你的帮助。非常感谢 :)

android android-fragments android-navigation android-jetpack android-architecture-navigation

10
推荐指数
2
解决办法
3179
查看次数