精华内容
下载资源
问答
  • 安卓开发UI设计

    2012-12-13 11:38:42
    移动客户端安卓开发,主要设计了客户端的前端,安卓软件UI设计,几乎用到了安卓UI设计的各个模块。各种安卓开发的逻辑模式和组件。
  • 安卓UI设计辅助软件

    2016-09-27 11:58:48
    一个是:Wireframe 有几个版本,支持Windows,还有Eclipse插件。 一个是:UIDesigner 2.5,腾讯的就是好,可以做WinFormUI设计,也支持安卓UI设计。

    一个是:Wireframe 有几个版本,支持Windows,还有Eclipse插件。
    一个是:UIDesigner 2.5,腾讯的就是好,可以做WinFormUI设计,也支持安卓UI设计。
    UIDesigner

    展开全文
  • java安卓仿微信聊天软件源码 android-ui awesome-github-android-ui 是由整理并维护的安卓UI相关开源项目库集合。我们会定期同步上的项目到这里,也欢迎各位给我们。 如果收录的项目有错误,可以通过反馈给我们。...
  • droid draw 安卓可视化编写ui界面软件 带有使用教程方便使用
  • java安卓仿微信聊天软件源码 awesome-github-android-ui 是由整理并维护的安卓UI相关开源项目库集合。我们会定期同步上的项目到这里,也欢迎各位给我们。 如果收录的项目有错误,可以通过反馈给我们。这里的项目Star...
  • 安卓前端UI一些有用的小技巧 EditText的一键清除小x 很多软件在编辑框处都有一键清除的按钮,这里介绍一下其实现方式 xml文件添加如下,使得清除按钮位于EditText的最右方 <EditText android:id="@+id/login_...

    安卓前端UI一些有用的小技巧

    EditText的一键清除小x

    效果图
    很多软件在编辑框处都有一键清除的按钮,这里介绍一下其实现方式
    xml文件添加如下,使得清除按钮位于EditText的最右方

    <EditText
        android:id="@+id/login_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/login_username_text"
        android:gravity="center"
        android:hint="请输入用户名"/>
    
    <Button
        android:id="@+id/login_username_clear"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_marginRight="5dp"
        android:background="@mipmap/clear"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="@id/login_username"
        app:layout_constraintRight_toRightOf="@id/login_username"
        app:layout_constraintTop_toTopOf="@id/login_username" />
    

    然后就是在java文件onCreate函数中实现逻辑了,这里我们所用到的控件为TextWatcher

    private EditText login_username;
    private Button login_username_clear;
    private TextWatcher login_username_watcher;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      	super.onCreate(savedInstanceState);
       	setContentView(R.layout.activity_login_register);
    
    	login_username = (EditText)findViewById(R.id.login_username);
    	login_username_clear = (Button)findViewById(R.id.login_username_clear);
    	login_username.addTextChangedListener(login_username_watcher);
    
    	login_username_watcher = new TextWatcher() {
        	public void onTextChanged(CharSequence s, int start, int before, int count) {}
        	public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
        	public void afterTextChanged(Editable s) {
            	login_password.setText("");
            	if(s.toString().length()>0){
                	login_username_clear.setVisibility(View.VISIBLE);
            	}else{
                	login_username_clear.setVisibility(View.INVISIBLE);
            	}
      		}
    	};
    }
    

    这样就实现了一键清除效果按钮了

    自定义Toolbar实现logo和小组件

    效果图
    效果图
    我使用Toolbar组件来实现了logo和APP名称的显示,同时还在右侧增加了小组件以便于功能拓展
    首先要把原有的ActionBar删除,这里需要修改AndriodManifest文件

    <activity
       	android:name=".MainPartActivity"
       	android:theme="@style/AppTheme" />
    
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- toolbar(actionbar)颜色 -->
        <item name="colorPrimary">@color/gray</item>
        <!-- 状态栏颜色 -->
        <item name="colorPrimaryDark">@android:color/darker_gray</item>
        <!-- 窗口的背景颜色 -->
        <item name="android:windowBackground">@color/white</item>
        <item name="actionOverflowMenuStyle">@style/MenuStyle</item>
    </style>
    

    删除了之后,就可以在xml文件中加入自定义的Toolbar了

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/colorPrimary"
        android:background="@color/Blue"
        app:navigationIcon="@mipmap/logo"
        app:popupTheme="@style/PopWindowBackgroundStyle"
        app:theme="@style/PopWindowStyle"
        app:title="易闲圈"
        app:titleTextColor="@color/black" />
    

    其中的PopWindowBackgroundStyle如下

    <style name="PopWindowStyle" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <!--字体和图标的颜色-->
        <item name="android:textColorPrimary">@color/black</item>
    </style>
    

    随后仍然是修改java文件

    private Toolbar toolbar;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_part);
    
    	toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    

    这里的main_menu就是自定义的右侧功能组文件,可以选择添加自己想要的功能,这里我定义了一个系统自带的搜索按钮和一个自定义的按钮

    <?xml version="1.0" encoding="utf-8"?>
    <menu android:name="menu1" xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <item android:id="@+id/search"
            android:title="搜索框"
            android:icon="@mipmap/search"
            app:showAsAction="always"
            app:actionViewClass="android.support.v7.widget.SearchView" />
    
        <item
            android:icon="@mipmap/icon_add"
            app:showAsAction="always"
            android:title="添加"
            app:actionProviderClass="com.example.asus.earingmoney.adapter.PlusActionProvider"/>
    </menu>
    

    PlusActionProvider类用于自定义新按钮的功能

    public class PlusActionProvider extends ActionProvider {
        /**
         * Creates a new instance.
         *
         * @param context Context for accessing resources.
         */
        private Context context;
    
        public PlusActionProvider(Context context) {
            super(context);
            this.context = context;
        }
    
        @Override
        public View onCreateActionView() {
            return null;
        }
    
        @Override
        public void onPrepareSubMenu(SubMenu subMenu) {
            subMenu.clear();
            subMenu.add(("新建跑腿任务"))
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            Intent intent = new Intent(getContext(),creat_errand_activity.class);
                            getContext().startActivity(intent);
                            return true;
                        }
                    });
            subMenu.add(("新建问卷任务"))
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            Intent intent = new Intent(getContext(),createQuestionare.class);
                            getContext().startActivity(intent);
                            return true;
                        }
                    });
        }
    
        @Override
        public boolean hasSubMenu() {
            return true;
        }
    }
    

    使用ViewPager和RadioGroup实现多页面滑动功能

    效果图
    三个界面支持点击下方按钮切换或滑动切换
    首先要明白的是这三个界面都是在同一个activity下,其中的页面内容可以通过修改ViewPager中绑定的Fragment来实现,上方的Toolbar则可以通过如上一个话题的onCreateOptionsMenu函数来实现修改
    xml文件修改如下

    <android.support.v4.view.ViewPager
        android:id="@+id/fragment_vp"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:layout_constraintBottom_toTopOf="@+id/tabs_rg"/>
    
    <RadioGroup
        android:id="@+id/tabs_rg"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="#dcdcdc"
        android:orientation="horizontal"
        android:weightSum="3"
        app:layout_constraintBottom_toBottomOf="parent"
        android:paddingTop="5dp">
    
        <RadioButton
            android:id="@+id/main_tab"
            android:checked="true"
            android:text="首页"
            android:layout_height="match_parent"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:textColor="@color/radiobutton_textcolor"
            android:drawableTop="@drawable/tab_main_selector"
            android:gravity="center"/>
    
        <RadioButton
            android:id="@+id/tasks_tab"
            android:text="任务"
            android:layout_height="match_parent"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:textColor="@color/radiobutton_textcolor"
            android:drawableTop="@drawable/tab_tasks_selector"
            android:gravity="center"/>
    
        <RadioButton
            android:id="@+id/me_tab"
            android:text="我的"
            android:layout_height="match_parent"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:textColor="@color/radiobutton_textcolor"
            android:drawableTop="@drawable/tab_me_selector"
            android:gravity="center"/>
        
    </RadioGroup>
    

    activity页面如下

    private ViewPager fragment_vp;
    private RadioGroup tabs_rg;
    private List<Fragment> fragments;
    private FragmentPagerAdapter adapter;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_part);
    
            fragment_vp = findViewById(R.id.fragment_vp);
            tabs_rg = findViewById(R.id.tabs_rg);
    
            fragments = new ArrayList<>(3);
            fragments.add(MainFragment.newInstance("首页"));
            fragments.add(TasksFragment.newInstance("任务"));
            fragments.add(MeFragment.newInstance("我的"));
    
    
            adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments);
            fragment_vp.setAdapter(adapter);
    
            fragment_vp.addOnPageChangeListener(mPageChangeListener);
            tabs_rg.setOnCheckedChangeListener(mOnCheckedChangeListener);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        fragment_vp.removeOnPageChangeListener(mPageChangeListener);
    }
    
    private ViewPager.OnPageChangeListener mPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
        }
    
        @Override
        public void onPageSelected(int position) {
            RadioButton radioButton = (RadioButton) tabs_rg.getChildAt(position);
            radioButton.setChecked(true);
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
    
        }
    };
    
    private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            for (int i = 0; i < group.getChildCount(); i++) {
                if (group.getChildAt(i).getId() == checkedId) {
                    fragment_vp.setCurrentItem(i);
                    if(headerUri != null)
                    {
                        CircleImageView btn = findViewById(R.id.headerPic);
                        if(btn == null)
                        {
                            return;
                        }
                        btn.setImageURI(headerUri);
                    }
                    if(sex == Constants.FEMALE)
                    {
                        ImageView sexImage = findViewById(R.id.sexImage);
                        if(sexImage == null)
                            return;
                        sexImage.setImageResource(R.mipmap.girl);
                    }
                    else
                    {
                        ImageView sexImage = findViewById(R.id.sexImage);
                        if(sexImage == null)
                            return;
                        sexImage.setImageResource(R.mipmap.boy);
                    }
                    return;
                }
            }
        }
    };
    
    private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    
        private List<Fragment> mList;
    
        public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
            super(fm);
            this.mList = list;
        }
    
        @Override
        public Fragment getItem(int position) {
            return this.mList == null ? null : this.mList.get(position);
        }
    
        @Override
        public int getCount() {
            return this.mList == null ? 0 : this.mList.size();
        }
    }
    

    最后再分别完成各个Fragment的内容就可以实现页面切换了

    使用Spinner实现Listview的分类筛选和顺序显示功能

    效果图
    xml文件比较简单,由多个Spinner构成即可

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    

    java文件如下,由于我是在Fragment中实现,所以会和在Activity中实现有所不同

    public class MainFragment extends Fragment {
    
    	private Spinner spinner1, spinner2, spinner3, spinner4;
        private List<Mission> missionslist = new ArrayList<Mission>();//missionslist为显示的内容,
        private List<Mission> totallist = new ArrayList<Mission>();   //totallist为所有mission内容,ques_list和err_list分别为问卷任务和跑腿任务
        private List<Mission> questionare_missionslist = new ArrayList<Mission>();
        private List<Mission> errand_missionslist = new ArrayList<Mission>();
    
    	private String[] mItems1,mItems2,mItems3,mItems4;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View rootView = inflater.inflate(R.layout.main_fragment, container, false);
            setHasOptionsMenu(true);
    
            spinner1 = rootView.findViewById(R.id.spinner1);
            spinner2 = rootView.findViewById(R.id.spinner2);
            spinner3 = rootView.findViewById(R.id.spinner3);
            spinner4 = rootView.findViewById(R.id.spinner4);
            mItems1 = getResources().getStringArray(R.array.spin1);
            mItems2 = getResources().getStringArray(R.array.spin2);
            mItems3 = getResources().getStringArray(R.array.spin3);
            mItems4 = getResources().getStringArray(R.array.spin4);
            ArrayAdapter<String> adapter1=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item, mItems1);
            ArrayAdapter<String> adapter2=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item, mItems2);
            ArrayAdapter<String> adapter3=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item, mItems3);
            ArrayAdapter<String> adapter4=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item, mItems4);
            adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            //绑定 Adapter到控件
            spinner1.setAdapter(adapter1);
            spinner2.setAdapter(adapter2);
            spinner3.setAdapter(adapter3);
            spinner4.setAdapter(adapter4);
    
    		iniSpiner();
        }
    
        private void iniSpiner(){//用于排序、筛选
    
            spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { //对问卷或跑腿任务进行筛选
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if(position == 0){
                        missionslist.clear();
                        missionslist.addAll(totallist);
                    }
                    else if(position == 1){
                        missionslist.clear();
                        missionslist.addAll(questionare_missionslist);
                    }
                    else{
                        missionslist.clear();
                        missionslist.addAll(errand_missionslist);
                    }
                    adapter.notifyDataSetChanged();
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    
            spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ //对酬劳进行排序
    
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if(position == 0){
                        MissionsSortUtil.sortById(missionslist);
                    }
                    else if(position == 1){
                        MissionsSortUtil.sortByPriceUp(missionslist);
                    }
                    else {
                        MissionsSortUtil.sortByPriceDown(missionslist);
                    }
                    adapter.notifyDataSetChanged();
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
    
            spinner3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ //对截止时间进行排序
    
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if(position == 0){
                        MissionsSortUtil.sortById(missionslist);
                    }
                    else if(position == 1){
                        MissionsSortUtil.sortByTimeUp(missionslist);
                    }
                    else {
                        MissionsSortUtil.sortByTimeDown(missionslist);
                    }
                    adapter.notifyDataSetChanged();
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
    
                }
            });
        }
    }
    

    上面的iniSpiner函数仅是我所需要的功能,大家可根据自己的需求自行更改
    还有上面的arrays文件则是用来显示spinner下拉后的内容

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="spin1">
            <item>所有类型</item>
            <item>问卷任务</item>
            <item>跑腿任务</item>
        </string-array>
    
        <string-array name="spin2">
            <item>任务酬劳</item>
            <item>升序</item>
            <item>降序</item>
        </string-array>
    
        <string-array name="spin3">
            <item>截止时间</item>
            <item>时间充裕</item>
            <item>时间急迫</item>
        </string-array>
    
        <string-array name="spin4">
            <item>tag</item>
            <item>tag1</item>
            <item>tag2</item>
        </string-array>
    
        <string-array name="missionOrTask">
            <item>我发布的</item>
            <item>我接受的</item>
        </string-array>
    
        <string-array name="completeness">
            <item>全部</item>
            <item>已完成</item>
            <item>未完成</item>
            <item>已过期</item>
        </string-array>
    </resources>
    

    上面代码中的几个MissionsSortUtil.sortBy函数也是我自己定义的排序函数,大家也可以根据自己Listview中的定义的属性来进行排序

    public class MissionsSortUtil {
    
        static Comparator<Mission> missionComparatorById = new Comparator<Mission>() {
            @Override
            public int compare(Mission lhs, Mission rhs) {
                if(lhs.getMissionId() > rhs.getMissionId())
                    return 1;
                return -1;       //注意此处不是0
            }
        };
    
        static Comparator<Mission> missionComparatorByPriceUp = new Comparator<Mission>() {
            @Override
            public int compare(Mission lhs, Mission rhs) {
                if(lhs.getMoney() < rhs.getMoney())
                    return 1;
                return -1;       //注意此处不是0
            }
        };
    
        static Comparator<Mission> missionComparatorByPriceDown = new Comparator<Mission>() {
            @Override
            public int compare(Mission lhs, Mission rhs) {
                if(lhs.getMoney() > rhs.getMoney())
                    return 1;
                return -1;       //注意此处不是0
            }
        };
    
        static Comparator<Mission> missionComparatorByTimeUp = new Comparator<Mission>() {
            @Override
            public int compare(Mission lhs, Mission rhs) {
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    if(sdf.parse(lhs.getDeadLine()).getTime() < sdf.parse(rhs.getDeadLine()).getTime())
                        return 1;
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return -1;
            }
        };
    
        static Comparator<Mission> missionComparatorByTimeDown = new Comparator<Mission>() {
            @Override
            public int compare(Mission lhs, Mission rhs) {
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    if(sdf.parse(lhs.getDeadLine()).getTime() > sdf.parse(rhs.getDeadLine()).getTime())
                        return 1;
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return -1;
            }
        };
    
        public static void sortById(List<Mission> missionsArray) {
            Collections.sort(missionsArray, missionComparatorById);
        }
        public static void sortByPriceUp(List<Mission> missionsArray) {
            Collections.sort(missionsArray, missionComparatorByPriceUp);
        }
        public static void sortByPriceDown(List<Mission> missionsArray) {
            Collections.sort(missionsArray, missionComparatorByPriceDown);
        }
        public static void sortByTimeUp(List<Mission> missionsArray) {
            Collections.sort(missionsArray, missionComparatorByTimeUp);
        }
        public static void sortByTimeDown(List<Mission> missionsArray) {
            Collections.sort(missionsArray, missionComparatorByTimeDown);
        }
    }
    

    使用SwipeRefreshLayout更新Listview

    效果图

    当我们使用Listview来显示我们从后台拿到的数据时,我们可能会想要有一个功能使得数据能够在想要的时候进行刷新,于是我就使用SwipeRefreshLayout实现了下拉刷新效果
    xml文件更改如下

    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/swipeLayout"
        app:layout_constraintTop_toBottomOf="@id/spinner_list_2"
        app:layout_constraintBottom_toBottomOf="parent">
    
        <ListView
            android:id = "@+id/list"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp">
        </ListView>
    </android.support.v4.widget.SwipeRefreshLayout>
    

    java文件如下

        swipeRefreshLayout = rootView.findViewById(R.id.swipeLayout);
        swipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT);
        swipeRefreshLayout.setProgressViewEndTarget(true, 200);
    
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeRefreshLayout.setRefreshing(true);
                getMissions();
            }
        });
    

    其中的setRefreshing函数即让它显示搜索时的转圈圈效果,这个效果需要手动关闭,即在getMissions函数结尾加上swipeRefreshLayout.setRefreshing(false);即可
    以上就是我对这次大项目所总结出的几个界面UI实用的小技巧,希望能够帮助到大家

    展开全文
  • 安卓Ui各种图标

    热门讨论 2013-07-23 17:47:22
    android UI.各种漂亮的小图标,基本集合了android 软件上的所有图标。什么主页、登录、退出、签到等等图标都弱爆了。应有尽有~~~30多个文件夹,每个文件夹里有至少有八九十个图标··· 需要的快来收藏吧,那么多...
  • 在界面设计的过程中,需要考虑如何制作出UI界面,怎么样控制UI界面两大块。 任何有编程常识的人都知道:软件界面是开发者添加控件,编写控件控制逻辑,完成用户界面的设计。代码编写过程中,定义控件对象实例之后...

    一  随便扯扯

        用户界面设计是程序开发的一项重要内容。在界面设计的过程中,需要考虑如何制作出UI界面,怎么样控制UI界面两大块。

        任何有编程常识的人都知道:软件界面是开发者添加控件,编写控件控制逻辑,完成用户界面的设计。代码编写过程中,定义控件对象实例之后添加到我们的界面上:MFC javaSwing编程都是这样通过代码控制添加完成的。同时也发现:在特定的界面上控件必然有存在的原因,正如注册界面肯定有文本框和提交按钮,这肯定导致了代码大量的冗余,复杂了界面设计。在简化代码写作方面,很多框架都采用了xml文件进行界面定义,安卓肯定也采用了这一机制。

        本文重点:

                      1>通过xml文件进行界面设计

                      2>通过代码控制进行界面设计

                  

    二  通过xml文件进行界面设计

        这一小节,我们将在Android Studio中通过xml完成界面设计。打开Android Studio,创建一个工程(自己动手创建,不要光看文章),在res/layout目录下面存放的是界面布局文件,我们的安卓界面xml文件就是存放在这儿的。双击你创建出来的文件,如下

        图中红色标记部分:左边是界面设计,右边对应了界面设计的xml文本。下面我们将通过操作,设计出一个界面

        请跟我做:

                     1>在左边控件中,拖动一个button到右边的手机界面中,之后你点击上线画圈右边的text查看文本,发现安卓已经编写好了xml

                     2>切换到代码目录,打开你之前创建的MainActivity,在onCreate()方法中:

    setContentView(R.layout.activity_main);  //这行代码是将我们编写的界面显示到手机屏幕中

                        MainActivity添加两个私有数据成员:

        private TextView tv;
        private Button bt;

                        onCreate()里面初始化tv和bt,并给bt添加监听事件

            tv = (TextView)findViewById(R.id.textView);//控件初始化
            bt = (Button) findViewById(R.id.button);//控件初始化
    
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    tv.setText("你点击了按钮!");
                }
            });//添加监听

        运行程序,点击按钮>>>>你会发现原来的hello world!文本发生改变。在这里,两个控件都是通过xml文件定义的,我们在代码中实现了一个监听器,也就是界面的控制逻辑。下面一节我们将通过代码进行界面设计。

     

    三    通过代码进行界面设计

         这一届,我们将上面的  setContentView(R.layout.activity_main);这一行代码删除,还有上一节的代码也都删除,activity_main.xml也可以不要了,因为不通过xml进行界面设计,将会和Swing一样通过代码实现。

         先定义MainActivity的私有成员

        private TextView tv;
        private Button bt;

    之后重写onCreate(),在之前删除onCreate()方法的位置添加代码:通过new定义一个线性布局(如果不知道什么事线性布局,请自行百度)和Button按钮和文本框控件,控件加入到布局里面,给控件加上监听事件,代码如下

    LinearLayout l = new LinearLayout(this);  //定义线性布局
            setContentView(l);                //线性布局加入屏幕
    
            tv = new TextView(this);          //定义控件
            bt = new Button(this);            //定义控件
    
            l.addView(bt);                   //加入布局
            l.addView(tv);                  //加入布局
    
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    tv.setText("你点击了按钮!");
                }
            });         //监听事件

    运行代码,点击按钮,将会出现"你点击了按钮!"的文本提示。

     

    四    总结

            安卓界面设计可以通过拖拽自动生成xml文件,这是一种十分高效的方式。其次,安卓也没有抛弃原生的灵活的代码控制界面生成方式。开发过程中,两者结合能够大大简化界面设计工作。

            烦请各位留个言。比如哪儿没有看懂,哪儿操作没成功可以给我留言,我再来修改文章。毕竟,一篇幅通俗易懂的文章是所有博客园人的追求。

     

    转载于:https://www.cnblogs.com/divingpig/p/6419045.html

    展开全文
  • java安卓仿微信聊天软件源码 awesome-github-android-ui 是由整理并维护的安卓UI相关开源项目库集合。我们会定期同步上的项目到这里,也欢迎各位给我们。 如果收录的项目有错误,可以通过反馈给我们。这里的项目Star...
  • 安卓开发笔记(十九):异步消息处理机制实现更新软件UI 主界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=...

    安卓开发笔记(十九):异步消息处理机制实现更新软件UI

    主界面代码

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
       <Button
           android:id="@+id/change"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="改变内容"/>
       <TextView
           android:id="@+id/text"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_centerInParent="true"
           android:text="你好,世界!"
           android:textSize="20sp"/>
    
    </RelativeLayout>

    主活动代码:

    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        private TextView text;
        public static final int UPDATE_TEXT=1;
        private Handler handler=new Handler(){
            public void handleMessage(Message msg){
                switch (msg.what){
                    case UPDATE_TEXT:
                        text.setText("遇见你真好");
                        break;
                        default:
                            break;
    
                }
            }
    
    
    
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            text=(TextView)findViewById(R.id.text);
            Button ChangeText=(Button)findViewById(R.id.change);
            ChangeText.setOnClickListener(this);
        }
        public void onClick(View v)
        {
            switch (v.getId())
            {
                case R.id.change:
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Message message=new Message();
                            message.what=UPDATE_TEXT;
                            handler.sendMessage(message);
    
                        }
                    }).start();
                    break;
                    default:
                        break;
            }
    
        }
    }

     

    posted @ 2019-03-31 21:07 Geeksongs 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 以父母之心办教育帮助学生成功 教师授课教案 二级学院 信息工程学院 授课班级 2017级软件技术1班 2017级[本科示范]软件1班 授课教师 黄 琳 教师职称 授课专业 软件工程 授课课程 安卓UI设计 授课时间 2018 年 3 月 5...
  • 在酷蜂科技广州APP开发专家看来,移动端APP开发UI设计要有其独有的一套设计规则和约束。新技术的不断加入促进了移动平台的快速增长,而移动端的UI设计也和传统的平面海报/网页设计不太一样。因此,想要成为一个合格...
  • 安卓Ui各种图标3

    2015-09-14 11:11:48
    android UI.各种漂亮的小图标,基本集合了android 软件上的所有图标。什么主页、登录、退出、签到等等图标都弱爆了。应有尽有~~~30多个文件夹,每个文件夹里有至少有八九十个图标··· 需要的快来收藏吧,那么多...
  • 安卓Ui各种图标2

    2015-09-14 11:09:38
    android UI.各种漂亮的小图标,基本集合了android 软件上的所有图标。什么主页、登录、退出、签到等等图标都弱爆了。应有尽有~~~30多个文件夹,每个文件夹里有至少有八九十个图标··· 需要的快来收藏吧,那么多...
  • java安卓仿微信聊天软件源码 Nav logo 首页 下载App × GitHub上受欢迎的Android UI Library 96 皇小弟 2017.10.19 14:46* 字数 29186 阅读 17858评论 15喜欢 476赞赏 1 内容 抽屉菜单 ListView WebView ...
  • java安卓仿微信聊天软件源码 android-ui awesome-github-android-ui 是由整理并维护的安卓UI相关开源项目库集合。我们会定期同步上的项目到这里,也欢迎各位给我们。 如果收录的项目有错误,可以通过反馈给我们。...
  • java安卓仿微信聊天软件源码 Copyright :copyright:2017 Powered by GitHub上受欢迎的Android UI Library 内容 抽屉菜单 ★7337 - 安卓抽屉效果实现方案 ★3865 - 创意边侧菜单 ★1744 - 向右滑动流动抽屉效果 ★...
  • 我在UI方面碰到了关于iOS和安卓这两方面的问题,在这一行技术类应该如何去使用安卓和iOS?...在关于UI方面的软件类应该如何使用这两种?他们主要在UI方面设计到那些方面的知识?  </p>
  • 这是我们公司开发的一款安卓点餐软件UI设计,压缩包内附PSD原件、所有图标PNG格式切片等等,下载之后可以根据自己情况修改即可使用!希望各位喜欢
  • 最重要的是,支持这些GUI框架的拖放工具和IDE通常可以引导GUI软件开发人员创建难以管理且难以阅读的代码。 这会进一步模糊业务逻辑和描述GUI的代码之间的界线,从而使软件维护更加困难。 常用缩略语 API:...
  • java安卓仿微信聊天软件源码 GitHub 上受欢迎的 Android UI Library整理 抽屉菜单 ★7337 - 安卓抽屉效果实现方案 ★3865 - 创意边侧菜单 ★1744 - 向右滑动流动抽屉效果 ★1338 - 仿DrawerLayout的ViewGroup ★1049...
  • Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't...用 uiautomatorviewer 获取安卓手机软件页面时报错: Error while obtaining UI hierarchy XML file: c...
  • java安卓仿微信聊天软件源码 androidUISupport 内容 抽屉菜单 ★7337 - 安卓抽屉效果实现方案 ★3865 - 创意边侧菜单 ★1744 - 向右滑动流动抽屉效果 ★1338 - 仿DrawerLayout的ViewGroup ★1049 - 单手势滑出侧边栏...
  • Android生活购物理财类源码,云信理财UI设计源码是一款理财产品软件UI设计,无实际功能.投资资讯按钮可以点击进去。也实现了购买和付款的界面。登录界面UI设计的很标准。输入任意帐号密码以后点击登录既可打开个人...
  • 第一次观看我文章的朋友,可以关注、点赞、转发一下,每天分享各种干货技术和程序猿趣事 前言 随着移动终端的快速发展,Android开发人员也越来越多,Android开发市场也进入了一个饱和的状态,Android开发人员也面临...
  • 本图标有助于Android...android图标素材,Android开发小图标收集,使用Android系统手机的朋友都会熟悉这些图标,在开发Android软件时候,这些图标可以作为你的借鉴素材,启发一下您的灵感,android图标素材供您下载。
  • 文章目录安卓软件盘弹出问题汇总前言1.1 常见软件盘弹出设置1.1.1 通过代码设置1.1.2 通过AndroidManifest.xml 项目清单文件设置1.1.3 其他情况1.2 沉浸模式下软件盘弹出问题 安卓软件盘弹出问题汇总 前言   这段...
  • 9个不同角度展示安卓手机应用软件UI界面设计作品展示PR模板Mogrt|Android安卓样机模板 主要特点: 适用于 Premiere Pro CC 2021+ 适用于图像或视频 轻松改变颜色 轻松关闭背景 模块化结构 包括视频教程 无需插件 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 547
精华内容 218
关键字:

安卓软件ui