Ящик навигации Android с несколькими действиями - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь создать BaseActivity с блоком навигации и расширить его в других действиях, чтобы я мог повторно использовать код блока навигации.

Что я понял до сих пор:

  • Я могу использовать фрагменты для этого (что я могу сделать).
  • Я могу использовать BaseActivity и раздувать область содержимого (в моем случае макет фрейма с идентификатором «main_container»), чтобы показать другие действия. В этом случае я понял, как нажимать на элементы панели навигации, чтобы изменить активность.

Однако, когда у меня есть кнопка внутри одного из моих действий (пример деятельности A), и я хочу загрузить другое действие (действие B), показать тост и т. Д., Нажав эту кнопку, прослушиватель щелчков не работает, пока я не напишу код для прослушивателя внутри метода onCreate BaseActivity.

Для меня это не имеет смысла, поскольку вынуждает меня писать все коды внутри BaseActivity, что не является наиболее эффективным способом написания кода (действия действуют как фрагменты, поэтому я могу вместо этого просто использовать фрагменты).

Что я хочу знать, так это как загрузить навигационный ящик для всех действий, расширяющих BaseActivity, и при этом позволить действиям сохранять свое поведение.

Образцы кода

My activity_home.xml (BaseActivity)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HomeActivity"
tools:openDrawer="start"
android:fitsSystemWindows="true">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/custom_tool"
        layout="@layout/custom_bar"/>


    <FrameLayout
        android:id="@+id/main_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

<android.support.design.widget.NavigationView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/nav_display"
    app:menu="@menu/nav_drawer_menu"
    android:layout_gravity="start"
    app:headerLayout="@layout/nav_header"/>

</android.support.v4.widget.DrawerLayout>

Activity_main.xml (ActivityA)

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="0dp"
    android:layout_height="147dp"
    android:layout_marginStart="105dp"
    android:layout_marginLeft="105dp"
    android:layout_marginTop="150dp"
    android:layout_marginEnd="105dp"
    android:layout_marginRight="105dp"
    android:layout_marginBottom="48dp"
    android:contentDescription="@string/app_logo"
    app:layout_constraintBottom_toTopOf="@+id/search_bar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="1.0"
    app:srcCompat="@mipmap/ic_launcher" />


<SearchView
    android:id="@+id/search_bar"
    android:layout_width="0dp"
    android:layout_height="48dp"
    android:layout_marginStart="50dp"
    android:layout_marginLeft="50dp"
    android:layout_marginTop="48dp"
    android:layout_marginEnd="50dp"
    android:layout_marginRight="50dp"
    android:layout_marginBottom="50dp"
    android:background="@drawable/input_default"
    android:gravity="center"
    app:layout_constraintBottom_toTopOf="@+id/search_button"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/imageView" />

<Button
    android:id="@+id/search_button"
    android:layout_width="0dp"
    android:layout_height="48dp"
    android:layout_marginStart="150dp"
    android:layout_marginLeft="150dp"
    android:layout_marginTop="50dp"
    android:layout_marginEnd="150dp"
    android:layout_marginRight="150dp"
    android:layout_marginBottom="228dp"
    android:background="@drawable/button_default"
    android:text="@string/search"
    android:textColor="@color/colorAccent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/search_bar" />

</android.support.constraint.ConstraintLayout>

Когда приложение изначально загружает «main_content» BaseActivity, надувается макет activity_main.

Когда я щелкнул кнопку search_button внутри activity_main.xml, я хочу загрузить другое действие, которое происходит, только когда я пишу код внутри базового действия.

HomeActivity

package com.example.naisse;


import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;

public class HomeActivity extends AppCompatActivity {

protected static int position;
private DrawerLayout drawer;
protected FrameLayout frames;

Button searchButton;
/**
 *  This flag is used just to check that launcher activity is called first time
 *  so that we can open appropriate Activity on launch and make list item position selected accordingly.
 * */
private static boolean isLaunch = true;

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

    Toolbar toolbar = findViewById(R.id.custom_tool);
    setSupportActionBar(toolbar);

    drawer = findViewById(R.id.drawer_layout);

    frames = findViewById(R.id.main_container);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();


    /*inflating the layout with activity_main*/
    getLayoutInflater().inflate(R.layout.activity_main, frames);



    searchButton = findViewById(R.id.search_button);

    searchButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            /*removing the activity_main and inflating they layout with activity_result*/
            frames.removeAllViews();
            getLayoutInflater().inflate(R.layout.activity_result, frames);
        }
    });
}

@Override
public void onBackPressed() {
    if(drawer.isDrawerOpen(GravityCompat.START)){
        drawer.closeDrawer(GravityCompat.START);
    }else{
        super.onBackPressed();
    }
}
}

Расширение MainActivity с HomeActivity

MainActivity

package com.example.naisse;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends HomeActivity {



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


}

}

Как решить эту проблему?

1 Ответ

0 голосов
/ 20 апреля 2019

Для ответа и понимания, пожалуйста, прочитайте дискуссию между мной и Майком М.

То, что я первоначально делал, надувал "main_container" макетом, и, следовательно, класс Activity не запускался.Для этого мне пришлось переопределить метод setContentView () внутри BaseActivity (в моем случае HomeActivity) и поместить в него каждый разделяемый код, например панель инструментов и ящик навигации.

Моя новая функция HomeActivity.class

public class HomeActivity extends AppCompatActivity {

private DrawerLayout drawer;
protected FrameLayout frames;

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

@Override
public void onBackPressed() {
    if(drawer.isDrawerOpen(GravityCompat.START)){
        drawer.closeDrawer(GravityCompat.START);
    }else{
        super.onBackPressed();
    }
}


@Override
public void setContentView(int layoutResID) {
    // Set the base layout
    super.setContentView(R.layout.activity_home);

    // Find the content container
    frames = findViewById(R.id.main_container);

    // Inflate the extending Activity's layout into it
    getLayoutInflater().inflate(layoutResID, frames);

    // The rest of the base setup
    Toolbar toolbar = findViewById(R.id.custom_tool);
    setSupportActionBar(toolbar);

    drawer = findViewById(R.id.drawer_layout);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
}

}

Теперь панель инструментов и панель навигации доступны для всех видов деятельности.

...