标签: android-navigation

如何通过操作栏中的后退按钮转到上一个片段?(科特林)

我有两个片段,我想使用操作栏中的后退按钮在它们之间创建交互。理想情况下,我希望保存先前片段的状态。我只能找到有关活动的信息。

对于片段我发现了这个

private fun setupBackButton() {
        if (activity is AppCompatActivity) {
            (activity as AppCompatActivity?)?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
        }
    }
Run Code Online (Sandbox Code Playgroud)

但它只显示后退按钮,点击没有任何反应。

编辑

在第一个片段中,我将第二个片段称为:

val fragment = UserContentFragment()
fragment.setUser(item.user)

if (fragmentManager != null) {
    fragmentManager!!
      .beginTransaction()
      .replace(R.id.main_layout, fragment)
      .addToBackStack(null)
      .commit()
}
Run Code Online (Sandbox Code Playgroud)

这是我的UserContentFragment第二个片段:

class UserContentFragment : Fragment() {

    private lateinit var user: SearchUser

    fun setUser(user: SearchUser) {
        this.user = user
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val root = inflater.inflate(R.layout.fragment_user_content, container, false)

        val userImage = root.findViewById(R.id.user_img) as ImageView
        if …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-actionbar android-navigation

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

如何从子可组合项控制脚手架的 FloatingActionButton onClick?

是否可以从可组合的屏幕(也在 aFloatingActionButton内部)设置 aonClick内部的值?在我的示例中,我希望能够更改 FAB 的 onClick 以根据屏幕可组合项内的值 ( ) 进行一些计算,而不将该值提升到该值所在的可组合项( )。ScaffoldNavHostScaffoldnameScaffoldMyActivity()

@Composable
fun MyActivity() {
    val navController = rememberNavController()

    Scaffold(
        floatingActionButton = {
            FloatingActionButton(onClick = { /* set this lambda from Screen1 */ }) { ... }
        }
    ) { paddingValues ->
        NavHost(
            navController = navController,
            startDestination = Screen.Screen1.route,
            modifier = Modifier.padding(paddingValues)
        ) {
            composable(route = Screen.Screen1.route) {
                Screen1()
            }
            ...
        }
    }
}

@Composable
fun Screen1() {
    var name …
Run Code Online (Sandbox Code Playgroud)

android-navigation android-jetpack-compose jetpack-compose-navigation

4
推荐指数
1
解决办法
1912
查看次数

Android - 导航抽屉片段

我在我的Android应用程序中实现了导航抽屉.但现在我希望能够在用户单击导航栏中的任何列表项时使用片段更改布局.这是我到目前为止所得到的:

XML

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:background="#000000"
        android:layout_height="match_parent" >       
    </FrameLayout>

    <ListView android:id="@+id/left_drawer"
        android:layout_width="220dp"
        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>
Run Code Online (Sandbox Code Playgroud)

Java文件

public class MainActivity extends Activity {
final String[] data ={"one","two","three"};

@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){
            drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){
                @Override …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-navigation

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

导航抽屉+ Viewpager + setVisibility = InflateException/NullPointer

我开发了一个Android应用程序,我遇到了一些问题.

在我的MainActivity我有以下组件:

  • 导航抽屉(实例化并加载许多碎片)
  • ViewPager(仅ArticleFragment显示文章的详细视图)

Normaly,ViewPager与特定的Activity相关,但我真的想同时使用Navigation Drawer和ViewPager.唯一的方法是在同一个活动中实现这两个元素.

DrawerLayout由导航抽屉本身和内容区域组成.在我的内容区域,我有一个FrameLayoutViewPager.问题是ViewPager始终显示.

所以我的想法是使用android:visibility属性来交替显示/隐藏FrameLayout和ViewPager.如果你看我的activity_main.xml,你可以看到在 android:visibility设置为invisibleViewPager.

/layout/activity_main.xml

    <!-- The main content view -->
    <RelativeLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/container"
            android:paddingTop="?android:attr/actionBarSize"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <!-- ViewPager -->
        <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="invisible" />

    </RelativeLayout>

    <!-- The navigation drawer -->
    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="NavigationDrawerFragment" />

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

然后:

MainActivity.java

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager navigation-drawer android-navigation

3
推荐指数
1
解决办法
4037
查看次数

主/细节流或导航抽屉?哪个更适合显示列表项的详细数据?

我有一个人员列表,当用户点击一个项目时,该应用程序会显示其详细信息!我使用双窗格主/细节设计模式的平板电脑大小和小尺寸它只是用细节片段替换列表.
问题是我的经理认为用导航抽屉改变这个设计会更好!这种情况的最佳选择是什么?导航抽屉主/细节设计?
哪个用户体验更好?

android design-patterns user-experience android-navigation

3
推荐指数
1
解决办法
2584
查看次数

如何隐藏顶部片段中的“向上按钮”并在其他片段中显示?

在与蓝牙相关的应用程序(带有minSdkVersion="18")中,我有一个MainActivity.java,显示以下 3 个 UI 片段之一:

  • MainFragment.java(顶部屏幕)
  • SettingsFragment.java(设置屏幕,通过菜单进入)
  • ScanningFragment.java(列出附近的蓝牙设备)

截屏

要显示“向上按钮”并处理“后退按钮”,我有以下代码:

public class MainActivity extends Activity 
                          implements BleWrapperUiCallbacks {

    // set in onResume() of each fragment
    private Fragment mActiveFragment = null;

´   @Override
    public void onBackPressed() {
        if (!getFragmentManager().popBackStackImmediate())
            super.onBackPressed();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_root);
        getActionBar().setDisplayHomeAsUpEnabled(true);

        if (savedInstanceState == null) {
            Fragment fragment = new MainFragment();
            getFragmentManager().beginTransaction()
                .replace(R.id.root, fragment, "main")
                .commit();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-actionbar up-button android-navigation

3
推荐指数
1
解决办法
1766
查看次数

查找 NavHostFragment Jetpack 导航 Android 时出错

我正在使用 Jetpack Navigation 来处理 Fragment 的导航。按照文档操作后,当我运行该应用程序时,出现以下错误。

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.navigation.fragment.NavHostFragment" 
Run Code Online (Sandbox Code Playgroud)

构建.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion 'android-P'

defaultConfig {
    applicationId "com.meditab.imspatient"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {

def nav_version = "1.0.0-alpha01"

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'androidx.constraintlayout:constraintlayout:1.1.0' // Constraint layout

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // Kotlin

// Anko
implementation "org.jetbrains.anko:anko-commons:$anko_version" // …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-jetpack android-architecture-navigation

3
推荐指数
1
解决办法
4366
查看次数

如何使用导航控制器设置导航抽屉并处理单个菜单项

我想让大部分菜单项由导航组件的控制器处理,但我也想单独处理一个“注销”菜单项,如下所示:

val navController = findNavController(R.id.nav_host_fragment)
        nav_view.setNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.logout_menu_item -> {
                    Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
                    true
                }
                else -> false
            }
        }
        nav_view.setupWithNavController(navController)
        bottom_navigation.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用,以及如何解决此问题?

android navigation-drawer android-navigation android-architecture-components

3
推荐指数
1
解决办法
526
查看次数

AndroidX 导航 navigationUp 两次

我正在使用新的 AndroidX 导航框架。

我有几个片段都链接在导航链中。

片段A --> 片段B --> 片段C

FragmentC 有一个“取消”按钮,它应该让我一直回到 FragmentA。

我应该执行以下操作:
在 FragmentC 上调用该方法:

 Navigation.findNavController(view).navigateUp();
Run Code Online (Sandbox Code Playgroud)

然后在 FragmentB 上侦听一些回调并使用一些传递的参数或参数触发来自 FragmentB 的另一个 navigationUp() 函数

或者是否有一些方法可以做相当于navigateUpTwice()

android android-navigation androidx

3
推荐指数
1
解决办法
1536
查看次数

如何防止使用导航控制器按“后退”按钮后显示先前的片段?

我正在尝试使用导航控制器。我想从LoginFragment移至HomeFragment。在LoginFragment此,我使用下面的代码移至HomeFragment

Navigation.findNavController(view).navigate(homeDestination)
Run Code Online (Sandbox Code Playgroud)

但是,当我点击中的后退按钮时HomeFragment,它将返回到LoginFragment,我希望当我点击按钮时它将关闭该应用程序。

以旧的方式,如果我使用activity而不是using Fragment,那么我通常会执行以下操作来获得预期的行为:

val intent = Intent(this,HomeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

通过使用这些标志,我可以用来获得预期的行为。但是我不使用导航控制器来实现相同的行为。

android kotlin android-navigation android-jetpack android-architecture-navigation

3
推荐指数
1
解决办法
1389
查看次数