wake-up-neo.com

Verwalten Sie die Navigation und die Zurück-Schaltfläche der Symbolleiste von Fragment in Android

Alle meine Fragmente werden durch ActionBarActivity (mainActivity) gesteuert. In mainActivity ist eine DrawerLayout implementiert, und alle untergeordneten Fragmente werden durch das Klicken des Listenelements von drawerLayout gedrückt. Das Problem, dem ich gegenüberstehe, ist, nachdem ich ein Fragment durch drawerLayout geschoben habe. Ich möchte das Schubladensymbol in ToolBar ändern, damit der Benutzer zum vorherigen Fragment navigieren und den Rückruf von Android.R.id.home entweder innerhalb desselben Fragments oder innerhalb der Hauptaktivität bearbeiten kann .

Der Code, den ich verwende, lautet:

MainActivity.Java

public class MainActivity extends ActionBarActivity {
    private DrawerLayout layoutDrawer;
    private ActionBarDrawerToggle drawerToggler;
    private Stack<Fragment> stack;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        stack = new Stack<Fragment>();
        layoutDrawer = (DrawerLayout) findViewById(R.id.layout_drawer);
        drawerToggler = new ActionBarDrawerToggle(this, layoutDrawer, toolbar,
                R.string.app_name, R.string.app_name);
        layoutDrawer.setDrawerListener(drawerToggler);

        setUpDrawerList();
        pushFragment(new FirstFragment(), true);

        Session.setContext(getApplicationContext());
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (drawerToggler.isDrawerIndicatorEnabled()
                && drawerToggler.onOptionsItemSelected(item))
            return true;
        switch (item.getItemId()) {
        case Android.R.id.home:
            Toast.makeText(this, "Back from activity", Toast.LENGTH_SHORT)
                    .show();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggler.syncState();
    }

    @Override
    public void onBackPressed() {
        popFragment();
    }

    private void setUpDrawerList() {
        ListView listView = (ListView) findViewById(R.id.list_drawer);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                Android.R.layout.simple_list_item_1,
                Arrays.asList(new String[] { "First Fragment",
                        "Second Fragment" }));
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                layoutDrawer.closeDrawers();
                drawerToggler.setDrawerIndicatorEnabled(false);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                pushFragment(getFragment(position), true);
            }
        });
    }

    private Fragment getFragment(int pos) {
        switch (pos) {
        case 0:
            return new FirstFragment();
        case 1:
            return new SecondFragment();
        }
        return null;
    }

    public void pushFragment(Fragment fragment, boolean add) {
        FragmentTransaction transation = getSupportFragmentManager()
                .beginTransaction();
        if (add)
            stack.Push(fragment);
        transation.replace(R.id.layout_content, fragment);
        transation.commit();
    }

    public void popFragment() {
        if (!stack.isEmpty()) {
            Fragment fragment = stack.elementAt(stack.size() - 2);
            stack.pop();
            pushFragment(fragment, false);
        } else
            super.onBackPressed();
        drawerToggler.setDrawerIndicatorEnabled(stack.size() == 1);
    }

    public void clearBackStack() {
        stack.clear();
    }
}

FirstFragment.Java

public class FirstFragment extends Fragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

    @Override
    public void onResume() {
        super.onResume();
        ActionBar actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar();
        actionBar.setTitle("First Fragment");
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.fragment_menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
        case Android.R.id.home:
            Toast.makeText(getActivity(), "Back from fragment", Toast.LENGTH_SHORT).show();
            getActivity().onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Aus dem obigen Code kann ich den Rückruf von Android.R.id.home nicht abrufen, und die Einstellung der Home-Taste funktioniert nicht jedes Mal. actionBar.setDisplayHomeAsUpEnabled(true);actionBar.setHomeButtonEnabled(true);

Jede Hilfe wird sehr geschätzt.

Vielen Dank

28
Abhishek Dhiman

Sie müssen die durch Drücken der Rücktaste gedrückt gehaltene Aktion für Ihre Hauptaktivität verwalten, da Ihre Hauptaktivität ein Container für Ihr Fragment ist. 

Fügen Sie zunächst Ihr all-Fragment zu transaction.addToBackStack (null) hinzu, und jetzt wird der Aufruf der Schaltfläche "Zurück zur Navigationstaste" für die Hauptaktivität ausgeführt. Ich hoffe, der folgende Code wird Ihnen helfen ...

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case Android.R.id.home:
        onBackPressed();
        }
    return super.onOptionsItemSelected(item);
}

sie können auch verwenden 

Fragment fragment =fragmentManager.findFragmentByTag(Constant.TAG); 
if(fragment!=null) {          
      FragmentTransaction transaction = fragmentManager.beginTransaction();
      transaction.remove(fragment).commit();
}

Um den Titel nach Fragmentnamen aus Fragment zu ändern, können Sie folgenden Code verwenden:

activity.getSupportActionBar().setTitle("Keyword Report Detail");
30
Amandeep Rohila

Fügen Sie eine Symbolleiste zu Ihrer XML hinzu

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Fragment title"/>

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

Dann in Ihrer onCreateView-Methode im Fragment:

Toolbar toolbar = view.findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.ic_back_button);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         getActivity().onBackPressed();
    }
});
28

Ich habe viele Lösungen im Kopf und keine davon funktioniert perfekt. Ich habe verschiedene Lösungsvarianten in meinem Projekt verwendet, die hier unten aufgeführt sind. Verwenden Sie diesen Code innerhalb der Klasse, in der Sie das Layout der Symbolleiste und der Schublade initialisieren.

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onBackPressed();
                    }
                });
            } else {
                //show hamburger
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true);
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                drawerFragment.mDrawerToggle.syncState();
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START);
                    }
                });
            }
        }
    });
21
Geek

Sie können die Toolbar innerhalb des Fragments verwenden und es ist einfach zu handhaben. Fügen Sie zunächst dem Layout des Fragments eine Symbolleiste hinzu

<Android.support.v7.widget.Toolbar
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:fitsSystemWindows="true"
    Android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    Android:background="?attr/colorPrimaryDark">
</Android.support.v7.widget.Toolbar>

Innerhalb der onCreateView-Methode im Fragment können Sie die Symbolleiste wie folgt behandeln.

 Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
 toolbar.setTitle("Title");
 toolbar.setNavigationIcon(R.drawable.ic_arrow_back);

Die Werkzeugleiste, der Titel und die Rückwärtspfeilnavigation werden vom IT-System auf die Werkzeugleiste gesetzt. Sie können jedes Symbol auf die setNavigationIcon-Methode setzen.

Wenn Sie beim Klicken auf das Navigationssymbol der Symbolleiste ein Ereignis auslösen müssen, können Sie dieses verwenden.

 toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           //handle any click event
    });

Wenn Ihre Aktivität über eine Navigationsleiste verfügt, müssen Sie diese möglicherweise öffnen, wenn Sie auf die Navigationsschaltfläche klicken. Sie können diese Schublade so öffnen.

 toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
            drawer.openDrawer(Gravity.START);
        }
    });

Vollständiger Code ist hier

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //inflate the layout to the fragement
    view = inflater.inflate(R.layout.layout_user,container,false);

    //initialize the toolbar
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    toolbar.setTitle("Title");
    toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //open navigation drawer when click navigation back button
            DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
            drawer.openDrawer(Gravity.START);
        }
    });
    return view;
}
7
Ishan Fernando

Wahrscheinlich die sauberste Lösung:

abstract class NavigationChildFragment : Fragment() {

    abstract fun onCreateChildView(inflater: LayoutInflater,
                                   container: ViewGroup?,
                                   savedInstanceState: Bundle?): View?

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val activity = activity as? MainActivity
        activity?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
        setHasOptionsMenu(true)
        return onCreateChildView(inflater, container, savedInstanceState)
    }

    override fun onDestroyView() {
        val activity = activity as? MainActivity
        activity?.supportActionBar?.setDisplayHomeAsUpEnabled(false)
        setHasOptionsMenu(false)
        super.onDestroyView()
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val activity = activity as? MainActivity
        return when (item.itemId) {
            Android.R.id.home -> {
                activity?.onBackPressed()
                true
            }
            else              -> super.onOptionsItemSelected(item)
        }
    }
}

Verwenden Sie diese Klasse einfach als übergeordnetes Element für alle Fragmente, die die Navigation unterstützen sollen.

4
Appyx

Zuerst fügen Sie die Schaltfläche Navigation zurück hinzu

   getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

Fügen Sie dann die Methode in Ihre HostActivity ein.

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()==Android.R.id.home)
    {
        super.onBackPressed();
        Toast.makeText(this, "OnBAckPressed Works", Toast.LENGTH_SHORT).show();
    }

    return super.onOptionsItemSelected(item);
}

Versuchen Sie dies, auf jeden Fall zu arbeiten.

1
Mohankumar Shan

OnToolBar befindet sich auf der linken Seite ein Navigationssymbol

Toolbar  toolbar = (Toolbar) findViewById(R.id.tool_bar);
        toolbar.setTitle(getResources().getString(R.string.title_activity_select_event));
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Wenn Sie dieses Symbol auf der linken Seite verwenden, wird das Navigationssymbol angezeigt und klicken Sie auf das Navigationssymbol, um die übergeordnete Aktivität anzuzeigen. 

und im Manifest können wir das System über die Aktivität der Eltern informieren.

  <activity
            Android:name=".CategoryCloudSelectActivity"
            Android:parentActivityName=".EventSelectionActivity"
            Android:screenOrientation="portrait" />
0
Deepak Gupta