как установить одну и ту же панель действий для всех действий?

Я пытаюсь установить одну и ту же панель действий (с настраиваемым шрифтом) для всех своих действий, но мой «метод» работает только для MainActivity, называемой LoginActivity.

public class LoginActivity extends ActionBarActivity {

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


        this.getActionBar().setDisplayShowCustomEnabled(true);
        this.getActionBar().setDisplayShowTitleEnabled(false);

        LayoutInflater inflator = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar, null);
        Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Billabong.ttf");

        TextView title = ((TextView)v.findViewById(R.id.custom_bar));
        title.setText(this.getTitle());
        title.setTypeface(font);

        this.getActionBar().setCustomView(v);

Если я вызову тот же фрагмент кода для другого действия, например MessagesActivity:

public class MessagesActivity extends ActionBarActivity {

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

        this.getActionBar().setDisplayShowCustomEnabled(true);
        this.getActionBar().setDisplayShowTitleEnabled(false);

        LayoutInflater inflator = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar, null);
        Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Billabong.ttf");

        TextView title = ((TextView)v.findViewById(R.id.custom_bar));
        title.setText(this.getTitle());
        title.setTypeface(font);

        this.getActionBar().setCustomView(v);

Когда я нажимаю кнопку, чтобы открыть это действие, я получаю сообщение об ошибке

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rram.wehere/com.rram.wehere.MessagesActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
        at android.app.ActivityThread.startActivityNow(ActivityThread.java:2045)
        at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
        at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
        at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749)
        at android.widget.TabHost.setCurrentTab(TabHost.java:413)
        at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:154)
        at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:548)
        at android.view.View.performClick(View.java:4438)
        at android.view.View$PerformClick.run(View.java:18439)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5149)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.rram.wehere.BaseActivity.onCreate(BaseActivity.java:23)
        at com.rram.wehere.MessagesActivity.onCreate(MessagesActivity.java:20)

Это говорит мне, что this.getActionBar() возвращает значение null, даже если я уже объявил, что тема имеет панель действий, как определено в моем манифесте, а затем в моих стилях.xml, например

<resources>
    <style name="myTheme"  parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/myTheme.ActionBar</item>
        <item name="android:actionMenuTextColor">@color/actionBarText</item>
    </style>

    <style name="myTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">@color/bluefb</item>
        <item name="android:titleTextStyle">@style/myTheme.ActionBar.Text</item>
        <item name="android:gravity">center</item>
    </style>

    <style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/black</item>
        <item name="android:textStyle">bold</item>
    </style>

I don't know how to fix this problem, can someone help me to fix this issue?


person Andrea Montanari    schedule 07.05.2014    source источник
comment
создать класс имеет функцию, которая будет управлять панелью действий. вызовите его, глядя на onCreat();.   -  person Shabbir Dhangot    schedule 07.05.2014
comment
Я думаю, что ваше представление V равно нулю в вашей активности сообщений   -  person Illegal Argument    schedule 07.05.2014
comment
Панель действий не может быть увеличена из файла макета по умолчанию.   -  person Illegal Argument    schedule 07.05.2014
comment
@IllegalArgument, ошибка не в представлении, а в функции getActionBar(), которая возвращает null!   -  person Andrea Montanari    schedule 07.05.2014
comment
возможный дубликат Повторное использование панели действий во всех действиях приложение   -  person Safvan 7    schedule 16.07.2014


Ответы (3)


Создайте один класс Activity с настройкой панели действий по своему усмотрению и распространите это действие на другие действия в своем приложении.

person Illegal Argument    schedule 07.05.2014
comment
Я пробовал, но ошибка сохраняется в строке кода this.getActionBar()...., кажется, что он не может найти ActionBar в других действиях. - person Andrea Montanari; 07.05.2014

Видеть это..

    public class ActionBarActivity extends Activity
    {


       setcontrol();

    }


    public static void setcontrol() {
        // TODO Auto-generated method stub
        ActionBar actionBar = getActionBar();
        LayoutInflater inflater = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.actionbar_custom_view_home, null);
        actionBar.setCustomView(view, new ActionBar.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);

        customActionbar_back_btn = (Button) view.findViewById(R.id.customActionbar_back_btn);
        customActionbar_back_btn.setBackgroundDrawable(getResources().getDrawable(R.drawable.addnew_button));
        customActionbar_back_btn.setCompoundDrawablesWithIntrinsicBounds( R.drawable.abc_ic_ab_back_holo_dark, 0, 0, 0);
    }

Теперь расширьте этот ActionBarActivity в своей деятельности и используйте этот метод для установки панели действий.

person Born To Win    schedule 07.05.2014
comment
ActionbarActivity - это класс по умолчанию, предоставляемый SDK, вы можете это сделать? - person Illegal Argument; 07.05.2014
comment
Я знаю это, но очень легко написать такой класс и получить доступ к методу. - person Born To Win; 07.05.2014

Привет всем, я добился такой же пользовательской панели действий/панели приложений во всех действиях.

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

<androidx.cardview.widget.CardView 
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="@dimen/dimen_60"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   app:cardElevation="@dimen/dimen_5"
   android:background="#ECF3F8">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginStart="@dimen/dimen_30">

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_voice"
            android:src="@drawable/ic_voice"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_battery"
            android:src="@drawable/ic_battery"
            app:layout_constraintStart_toEndOf="@id/iv_voice"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dimen_20"/>

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_wifi"
            android:src="@drawable/ic_wifi"
            app:layout_constraintStart_toEndOf="@id/iv_battery"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dimen_20"/>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tc_time"
        android:format12Hour="hh:mm a"
        android:textSize="@dimen/text_20"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginEnd="@dimen/dimen_30">

        <ImageView
            android:layout_width="@dimen/dimen_30"
            android:layout_height="@dimen/dimen_30"
            android:id="@+id/iv_more"
            android:src="@drawable/ic_more"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_user"
            android:src="@drawable/ic_user"
            app:layout_constraintStart_toEndOf="@id/iv_more"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dimen_20"/>

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_map"
            android:src="@drawable/ic_map"
            app:layout_constraintStart_toEndOf="@id/iv_user"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dimen_20"/>

        <ImageView
            android:layout_width="@dimen/dimen_25"
            android:layout_height="@dimen/dimen_25"
            android:id="@+id/iv_home"
            android:src="@drawable/ic_home"
            app:layout_constraintStart_toEndOf="@id/iv_map"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dimen_20"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

Это мой пользовательский интерфейс панели приложений

Затем создал фрагмент и включил вышеуказанный пользовательский интерфейс в файл xml.

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

Теперь мы можем получить доступ к значку панели приложений во фрагменте и добавить прослушиватель событий.

public class AppBarFragment extends Fragment {

FragmentAppBarBinding binding;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentAppBarBinding.inflate(getLayoutInflater());

    binding.appBarLayout.ivVoice.setOnClickListener(v ->
            startActivity(new Intent(requireActivity(), 
    ActivityContact.class)));


    return binding.getRoot();
}
}

Теперь нам нужно заменить этот фрагмент во всех активностях, где мы хотим показывать панель приложений.

Это код Java для всех действий

 FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.app_bar_layout, new AppBarFragment());
    transaction.commit();

Это xml-код для всех действий

<FrameLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:id="@+id/app_bar_layout"
   app:layout_constraintTop_toTopOf="parent"/>

Пусть это поможет тебе

-Спасибо.

person Sachidanand Pandit    schedule 02.08.2021