android中ToolBar设置NavigationIcon图标不显示、失败、没反应,绝对管用

 更新时间:2016年10月2日 16:23  点击:2578
ToolBar工具昨天介绍过相关的教程今天我们来看看关于android中ToolBar设置NavigationIcon图标不显示、失败、没反应,绝对管用问题的解决办法。

最近开发android app,程序中用到ToolBar控件,想设置ToolBar的NavigationIcon图标图标可是怎么设置都不管用,一直显示控件自带的。
异常:
在布局XML中设置android:navigationIcon=”@drawable/icon”或者在代码中设置都无法自定义成自己需要设置的NavigationIcon图片。
代码设置NavigationIcon如下:


Toolbar toolbar = (Toolbar)findViewById(R.id.my_toolbar);
toolbar.setNavigationIcon(R.drawable.icon);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);
setSupportActionBar(toolbar);

解决办法:

如果你在XML布局中设置ToolBar设置NavigationIcon,那么现在需要放弃这种做法,否则始终无法显示出你设置的NavigationIcon;
必须使用代码方式:


setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
toolbar.setSubtitle("");
setSupportActionBar(toolbar);
 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
toolbar.setNavigationIcon(R.mipmap.userphoto);

本文章来为各位介绍一篇关于android中使用Post方法调用asp.net webapi接口方法了,这个是以HttpURLConnection使用为例子了,具体如下。


android开发想接口获取数据是必须的操作,一般获取数据有post和get两种方式,本文讲解客户端使用post方法调取服务器端使用asp.net webapi开发接口数据。
1、访问接口类


package http;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
 
import android.widget.Toast;
 
public class HttpUtils {
    public static String getJsonContent(String urlPath,String data) {
        String webServiceUrl="http://hayi.8888.com";
        try {
            URL url = new URL(webServiceUrl+urlPath);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setConnectTimeout(3000);
            connection.setRequestMethod("POST");
            connection.setDoOutput(true); // 发送POST请求必须设置允许输出
            connection.setDoInput(true);
            //获取输出流
            OutputStream os = connection.getOutputStream();
            os.write(data.getBytes());
            os.flush();
            int code = connection.getResponseCode();
            if (code == 200) {
                return changeInputStream(connection.getInputStream());
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return "";
    }
 
    private static String changeInputStream(InputStream inputStream) {
        // TODO Auto-generated method stub
        String JsonString = "";
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] data = new byte[1024];
        try {
            while ((len = inputStream.read(data)) != -1) {
                outputStream.write(data, 0, len);
            }
            JsonString = new String(outputStream.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JsonString;
    }
}

2、使用方法


// 传递的数据
                String dataPare = "userName=" + URLEncoder.encode(usernameTxt.getText().toString().trim(), "UTF-8")
                        + "&userPass=" + URLEncoder.encode(userpassTxt.getText().toString().trim(), "UTF-8");
                jsonString = HttpUtils
                        .getJsonContent("/api/Values/PostUserLogin",dataPare );

SharedPreferences在android开发中用到的比较多了它是用来存储用户信息为主了,下面我们来看一篇关于android SharedPreferences详解,同时后在也介绍过了存储用户状态信息的例子。


在andorid很多应用开发中都需要记录用户登录信息,使用静态变量手机关机用户状态清除,解决方法是使用SharedPreferences存储android用户信息。

一、SharedPreferences基础知识介绍

获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
 
SharedPreferences的四种操作模式:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
 
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.

二、数据保存至SharedPreferences:

用户登录成功后记录登录信息方法
SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Editor editor=preferences.edit();
String userName="用户名";
editor.putString("userName", userName);
editor.commit();

三、从SharedPreferences获取数据:

SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
String name=preferences.getString("name",null);

四、清除SharedPreferences值

SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
preferences.edit().clear().commit();
用户点击用户程序退出后清除SharedPreferences登录信息


五、SharedPreferences来保存用户参数及读取


软件需求:用户输入姓名和年龄点击保存按钮将信息保存到xml中当再次登陆的时候输入的信息显示在文本框中

Activity文件

 

[java] view plain copy
package com.example.shareperences; 
 
import java.util.Map; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
 
import com.example.service.PrefercesService; 
 
public class MainActivity extends Activity { 
    private Button button; 
    private EditText name,age; 
    private PrefercesService prefercesService; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        button=(Button)this.findViewById(R.id.button); 
        name=(EditText)this.findViewById(R.id.name); 
        age=(EditText)this.findViewById(R.id.age); 
        prefercesService=new PrefercesService(this); 
        Map<String,String> params=prefercesService.getPreferences(); 
        name.setText(params.get("name")); 
        age.setText(params.get("age")); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.main, menu); 
        return true; 
    } 
    public void save(View v){ 
        /*
         * 如果想在Activity中得到SharedPreferences对象则可以用方法
         * this.getPreferences(mode)这里只有一个参数 文件存储类型,此时文件的名字默认为
         * 当前activity的名字 不包括包名
         */ 
        String nameString=name.getText().toString(); 
        String ageString=age.getText().toString(); 
        prefercesService.save(nameString,Integer.parseInt(ageString)); 
        Toast.makeText(MainActivity.this, R.string.success, Toast.LENGTH_LONG).show(); 
    } 
 

[java] view plain copy
package com.example.service; 
 
import java.util.HashMap; 
import java.util.Map; 
 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
 
public class PrefercesService { 
    private Context context; 
    public PrefercesService(Context context) { 
        super(); 
        this.context = context; 
    } 
  /**
   * 保存参数 
   * @param name 姓名
   * @param age  年龄
   */ 
    public void save(String name, int age) { 
        //第一个参数 指定名称 不需要写后缀名 第二个参数文件的操作模式 
        SharedPreferences preferences=context.getSharedPreferences("itcast", Context.MODE_PRIVATE); 
        //取到编辑器 
        Editor editor=preferences.edit(); 
        editor.putString("name", name); 
        editor.putInt("age", age); 
        //把数据提交给文件中 
        editor.commit(); 
    } 
    /**
     * 获取各项配置参数
     * @return
     */ 
   public Map<String,String> getPreferences(){ 
     SharedPreferences pre=context.getSharedPreferences("itcast", Context.MODE_PRIVATE); 
     //如果得到的name没有值则设置为空 pre.getString("name", ""); 
     Map<String,String> params=new HashMap<String,String>(); 
     params.put("name", pre.getString("name", "")); 
     params.put("age", String.valueOf(pre.getInt("age", 0))); 
        
       return params; 
        
        
   } 

布局文件注意button应该这样设置

[html] view plain copy
<Button  
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:id="@+id/button" 
         android:text="@string/save" 
         android:onClick="save" 
         /> 

Toolbar是android L引入的一个新控件,可以理解为action bar的第二代:提供了action bar类似的功能,但是更灵活。

不像actionbar那么固定,Toolbar更像是一般的View元素,可以被放置在view树体系的任意位置,可以应用动画,可以跟着scrollView滚动,可以与布局中的其他view交互。当然,你还可以用Toolbar替换掉actionbar,只需调用 Activity.setActionBar()。

虽然toolbar已经出来很长时间,但还是有些必要再进行简单介绍,

先上布局

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
 
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:theme="@style/AppTheme.AppBarOverlay"
        >
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerInParent="true"
            android:layout_marginLeft="15dp"
            android:background="@mipmap/icon_index_search" />
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="搜索"
            android:textColor="#956C28"
            android:textSize="16sp" />
 
 
 
        </android.support.v7.widget.Toolbar>
 
</android.support.design.widget.AppBarLayout>
屏幕快照 2016-04-22 16.38.12

上面的布局呈现的是这种效果,可以在里面进行自定义,也可以通过menu进行控件的编写,如果需要在滑动的时候隐藏toolbar就需要在外面包裹一层APPBarLayout


<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_location"
        android:orderInCategory="0"
        android:title="定位"
        android:icon="@mipmap/icon_index_location"
        app:showAsAction="ifRoom" />
 
 
</menu>
在这里可以指定toolbar显示哪些控件,app:showAsAction的属性可以指定该图标是显示在toolbar上还是显示在菜单里,大家可以自行测试,

下面进入核心代码部分,

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.mipmap.icon_index_menu);
setSupportActionBar(toolbar);

可以通过toolbar对象来设置我们需要的结果,例如icon,标题,副标题等等,


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
 
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_location) {
 
        return true;
    }
 
    return super.onOptionsItemSelected(item);
}
重写上述两个方法进行toolbar上的菜单按钮加载,然后设置监听,到此就结束了。下面说一下需要注意的地方,在布局文件中也可以设置icon、title等,但是需要加入自定义属性的命名空间


<pre class="hljs xml"><code class="xml">xmlns:toolbar="http://schemas.android.com/apk/res-auto"</code>

然后通过toolbar:title=””来设置各种属性。

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • Android判断当前屏幕是全屏还是非全屏

    在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20
  • Android开发中布局中的onClick简单完成多控件时的监听的利与弊

    本文章来为各位介绍一篇关于Android开发中布局中的onClick简单完成多控件时的监听的利与弊的例子,希望这个例子能够帮助到各位朋友. 首先在一个控件加上这么一句:and...2016-09-20
  • Ubuntu 系统下安装Android开发环境 Android Studio 1.0 步骤

    Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,可以在Linux,Mac OS X,Window...2016-09-20
  • Android实现简单用户注册案例

    这篇文章主要为大家详细介绍了Android实现简单用户注册案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-26