Приложение вылетает при использовании getActionBar.setTitle ();расширяя FragmentActivity - PullRequest
0 голосов
/ 15 сентября 2018

Приложение аварийно завершает работу, получая исключение нулевого указателя в getActionBar.setTitle (....) ? Как это решить? Я попытался getSupportActionBar вместо getActionBar .. а это не сработало? может кто-нибудь помочь мне ..

package com.msinfolab.mandy.tfq;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends FragmentActivity{

    private Fragment contentFragment;
    QuotecardListFragment pdtListFragment;
    FavoriteListFragment  favListFragment;

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

        FragmentManager fragmentManager = getSupportFragmentManager();

        /*
         * This is called when orientation is changed.
         */
        if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("content")) {
                String content = savedInstanceState.getString("content");
                if (content.equals(FavoriteListFragment.ARG_ITEM_ID)) {
                    if (fragmentManager.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID) != null) {
                        setFragmentTitle(R.string.favorites);
                        contentFragment = fragmentManager
                                .findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID);
                    }
                }
            }
            if (fragmentManager.findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID) != null) {
                pdtListFragment = (QuotecardListFragment) fragmentManager
                        .findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID);
                contentFragment = pdtListFragment;
            }
        } else {
            pdtListFragment = new QuotecardListFragment();
            setFragmentTitle(R.string.app_name);
            switchContent(pdtListFragment, QuotecardListFragment.ARG_ITEM_ID);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (contentFragment instanceof FavoriteListFragment) {
            outState.putString("content", FavoriteListFragment.ARG_ITEM_ID);
        } else {
            outState.putString("content", QuotecardListFragment.ARG_ITEM_ID);
        }
        super.onSaveInstanceState(outState);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_favorites:
                setFragmentTitle(R.string.favorites);
                favListFragment = new FavoriteListFragment();
                switchContent(favListFragment, FavoriteListFragment.ARG_ITEM_ID);

                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void switchContent(Fragment fragment, String tag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        while (fragmentManager.popBackStackImmediate());

        if (fragment != null) {
            FragmentTransaction transaction = fragmentManager
                    .beginTransaction();
            transaction.replace(R.id.content_frame, fragment, tag);


            if (!(fragment instanceof QuotecardListFragment)) {
                transaction.addToBackStack(tag);
            }
            transaction.commit();
            contentFragment = fragment;
        }
    }



    protected void setFragmentTitle(int resourseId) {
        setTitle(resourseId);

        getActionBar().setTitle(resourseId);

    }


    @Override
    public void onBackPressed() {
        FragmentManager fm = getSupportFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
            super.onBackPressed();
        } else if (contentFragment instanceof QuotecardListFragment
                || fm.getBackStackEntryCount() == 0) {
            finish();
        }
    }
}

эта часть кода предупреждает исключение нулевого указателя .. как это исправить?

protected void setFragmentTitle(int resourseId) {
        setTitle(resourseId);

        getActionBar().setTitle(resourseId);

    }

и другое предупреждение .. равно может привести к исключению нулевого указателя .. как решить эту проблему

if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("content")) {
                String content = savedInstanceState.getString("content");
                if (content.equals(FavoriteListFragment.ARG_ITEM_ID)) {
                    if (fragmentManager.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID) != null) {
                        setFragmentTitle(R.string.favorites);
                        contentFragment = fragmentManager
                                .findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID);
                    }
                }
            }
            if (fragmentManager.findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID) != null) {
                pdtListFragment = (QuotecardListFragment) fragmentManager
                        .findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID);
                contentFragment = pdtListFragment;
            }
        } else {
            pdtListFragment = new QuotecardListFragment();
            setFragmentTitle(R.string.app_name);
            switchContent(pdtListFragment, QuotecardListFragment.ARG_ITEM_ID);
        }

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Создать Панель инструментов * Макет 1002 *, который должен быть общей панелью инструментов для всех фрагментов. И установить заголовок для панелей инструментов, например toolbar.setTitle(getString(R.string.menu_category));

0 голосов
/ 15 сентября 2018

Прежде всего, вам нужно определить свою собственную панель инструментов во фрагментном макете XML, не так ли?

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary">

</android.support.v7.widget.Toolbar>

Затем в вашем методе onCreate , до установки заголовка, вам нужно сделать следующее:

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

И, наконец, в вашем методе setFragmentTitle вы устанавливаете заголовок панели инструментов следующим образом:

((Toolbar) findViewById(R.id.toolbar)).setTitle(resourseId);

Пожалуйста, дайте мне знать, если проблема решена.

0 голосов
/ 15 сентября 2018
 ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Profile");

Надеюсь, что его работа

...