뷰페이저를 사용중에 특정 페이지만 툴바메뉴가 보였으면 좋겠다고 하는 미치광이들이 아주 간혹 있습니다.


이런 미치광이들을 상대하는 개발자들을 위해 공유드립니다


                                        


1번1번  2번





우선 findViewById메서드로 Toolbar객체 DrawerLayout객체를 만들어 줍니다.

/**
* 1번 좌측메뉴, 좌측슬라이드 노출되도록 설정
*/
protected void setToolbarVisibleLeftMenu() {
if (mToolbar != null && mDrawerLayout != null) {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(true);
// 상단 툴바를 이용하여 좌측 메뉴 열기 / 닫기 설정
mActionBarDrawerToggle = new ActionBarDrawerToggle((Activity) getNowContext(), mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
// Drawer Toggle Object Made
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); // Drawer Listener set to the Drawer toggle
mActionBarDrawerToggle.syncState();
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
}

/**
* 2번 좌측메뉴, 좌측슬라이드 노출되지않도록 설정
*/
protected void setToolbarGoneLeftMenu() {
if (mToolbar != null && mDrawerLayout != null) {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}


728x90
반응형

안드로이드는 다음과 같이 휠을 날짜나 시간, 숫자만 제공해줍니다.


  





글자(String)가 쓰여진 휠뷰는 안드로이드 자체적으로 제공해 주지 않습니다. 그래서 lib를 써야합니다.

많은  lib들이 있지만 그중에 가장 괜찮고 안정성 있는 lib라고 생각되어 소개합니다.



Github 주소

https://github.com/maarek/android-wheel





Demo


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


setContentView(R.layout.cities_layout);

String[] locationData= new String[]{"남산", "대구", "부산", "인천", "경주", "안산", "서울", "광주", "충주", "강원"};



WheelView country = (WheelView) findViewById(R.id.country);


  // Cyclic 여부 true일경우 위아래로 값이 생겨서 무제한 스크롤 가능(직접 해보시길 설명을 못하겟음) 

country.setCyclic(false);

country.setCurrentItem(0); // position 설정 혹은 index 설정

country.setVisibleItems(3); // 보여줄 item의 개수(테스트 결과 이 함수는 적용되지 않는다.)

ArrayWheelAdapter<String> adapter = new ArrayWheelAdapter<String>(this, locationData);

adapter.setTextSize(30); // 글씨 크기

country.setViewAdapter(adapter); //어댑터를 설정한다.

country.addScrollingListener( new OnWheelScrollListener() {

@Override

public void onScrollingStarted(WheelView wheel) {

// 스크롤 시작

scrolling = true;

}

@Override

public void onScrollingFinished(WheelView wheel) {

// 스크롤 끝

scrolling = false;

}

});

}




이슈사항


- 아래 그림의 휠 두개는 서로 연동 됩니다. 예를 들어 지역 휠을 컨트롤 하여 "남산"을 선택 시 층은 11층까지 보이도록 갱신됩니다.

 앞에 설명과 같이 지역 휠을 컨트롤 하여 "부산"을 선택 시 1층만 보이도록 갱신됩니다.

ex)

남산 - 1,2,3,4,5,6,7,8,9,10,11층

대구 - 1,2,3층

부산 - 1층

인천 - 1,2,3,4,5,6층

   .

   .

   .



-휠을 두개 쓸 경우 층 휠을 맨 밑으로 내리고 바로 지역 휠을 스크롤 할 경우 층 휠의 층수가 보이지 않는 이슈가 있습니다.




해결방법

-완벽한 해결 방법은 아니지만 onScrollingStarted콜백이 호출 될때마다 층휠을 setCurrentItem(0);으로 초기화 해주면 해당이슈사항은 해결 됩니다. 

728x90
반응형

안드로이드에서는 키보드가 올라가고 내려갈때 콜백 이벤트 필요한 순간이 있을때


이 코드를 사용하시면 됩니다.


우선 구글링으로 찾은 이곳에서 SoftKeyboard 클래스의 용도를 확인합니다.


https://felhr85.net/2014/05/04/catch-soft-keyboard-showhidden-events-in-android/


안에 들어가 보시면 It is available here. 이라고 쓰인 곳을 누르면 SoftKeyboard.java를 다운받을 수 있도록 안내해 줍니다.


SoftKeyboard.java를 다운받고 프로젝트에 넣고 아래 소스를 넣어 줍니다.


TestAct.java


package com.example.testline;


import android.app.Activity;

import android.app.Service;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.view.inputmethod.InputMethodManager;

import android.widget.LinearLayout;


public class TestAct extends Activity {

SoftKeyboard mSoftKeyboard;

LinearLayout mLlEdit;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


mLlEdit = (LinearLayout) findViewById(R.id.ll_edit);


InputMethodManager controlManager = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE);

mSoftKeyboard = new SoftKeyboard(mLlEdit, controlManager);

mSoftKeyboard.setSoftKeyboardCallback(new SoftKeyboard.SoftKeyboardChanged() {

@Override

public void onSoftKeyboardHide() {

new Handler(Looper.getMainLooper())

.post(new Runnable() {

@Override

public void run() {

// 키보드 내려왔을때

}

});

}


@Override

public void onSoftKeyboardShow() {

new Handler(Looper.getMainLooper())

.post(new Runnable() {

@Override

public void run() {

// 키보드 올라왔을때

}

});

}

});


}


@Override

public void onDestroy() {

super.onDestroy();

mSoftKeyboard.unRegisterSoftKeyboardCallback();

}


}



activity_main.xml 파일


     <LinearLayout

        android:id="@+id/ll_edit"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:focusable="true"

        android:focusableInTouchMode="true"

        android:orientation="horizontal" >

<TextView

          android:layout_width="80dp"

          android:layout_height="41.33dp"

          android:gravity="center_vertical"

          android:text="@string/visit_floor"

          android:textColor="@android:color/black"

          android:textSize="16.67sp" />


      <EditText

          android:id="@+id/EditText"

          android:layout_width="fill_parent"

          android:layout_height="41.33dp"

          android:layout_gravity="center"

          android:gravity="center"

          android:inputType="textAutoComplete"

          android:textSize="16.67sp" />

  </LinearLayout>


SoftKeyboard.java


728x90
반응형

일반적인 String 스피너 만들기


- SpinnerActivity.java


public class SpinnerActivity extends BaseActivity {

private String[] mCategoryArr = null;
private Spinner mSubjectSpinner = null;
private String mSelectCategory = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.spinner_activity);
initView();
}


private void initView() {
mSubjectSpinner = (Spinner) findViewById(R.id.subject_spinner);
mSubjectSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
switch (position) {
case 0:
mSelectCategory = mCategoryArr[0];
break;

case 1:
mSelectCategory = mCategoryArr[1];
break;

case 2:
mSelectCategory = mCategoryArr[2];
break;

}

}


@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}

});

}

private void settingView() {
mCategoryArr = getResources().getStringArray(R.array.subject_array);
mSelectCategory = mCategoryArr[0];
ArrayAdapter<CharSequence> spinnerLargerAdapter = ArrayAdapter.createFromResource(this, R.array.subject_array, R.layout.spinner_item);
mSubjectSpinner.setAdapter(spinnerLargerAdapter);
mSubjectSpinner.setSelection(0);
}
}



R.layout.spinner_activity.xml

#저 같은 경우 @drawable/ic_keyboard_arrow_down_black_24dp을 drawable-hdpi폴더에만 넣어놨습니다.


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical">


<Spinner
android:id="@+id/free_subject_spinner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginRight="10dp"
android:background="@drawable/ic_keyboard_arrow_down_black_24dp"
/>
</LinearLayout>



R.layout.spinner_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/spinner_title"
android:layout_height="50dp"
android:paddingLeft="14.62dp"
android:textSize="16dp"
android:textColor="@color/black_color"
android:singleLine="true"
android:ellipsize="marquee"
android:background="@drawable/custom_menu_item_bg"
android:gravity="center_vertical"/>




res\drawable\custom_menu_item_bg.xml


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#e6e6e6"/>
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
</shape>
</item>
</selector>



res\values\arrays.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="subject_array">
<item>[건의]</item>
<item>[후기]</item>
<item>[기타]</item>
</string-array>
</resources>




728x90
반응형

'Android' 카테고리의 다른 글

안드로이드 WheelView or StringPicker  (0) 2017.03.03
안드로이드 키보드 이벤트  (0) 2017.02.23
안드로이드 액티비티 애니메이션  (0) 2016.11.14
RecyclerView 만들기  (0) 2016.11.14
Activity와 Fragment간 데이터 전달  (0) 2016.11.14

액티비티를 호출 할 때


Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_slide_in_right, R.anim.anim_slide_out_left);



액티비티를 종료할 때


@Override
public void finish() {
super.finish();
if(isChoice){
overridePendingTransition(R.anim.anim_slide_in_right, R.anim.anim_slide_out_left);
}else{
overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_right);
}
}

anim 파일들은 해당경로에 넣어주세요


res/anim/여기에 밑에 파일들을 넣어주세요.



anim_slide_in_left.xml

anim_slide_in_right.xml

anim_slide_out_left.xml

anim_slide_out_right.xml


728x90
반응형

먼저 RecyclerView를 만들기 위해서 



앱 build.gradle에 appcompatV7와 recycleview lib를 추가해야합니다.


compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:recyclerview-v7:25.0.0'



MainActivity


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.damoa.testfragment.dummy.DummyContent;

public class MainActivity extends AppCompatActivity {

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

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.test_recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new MyItemRecyclerViewAdapter(this,DummyContent.ITEMS));
}

}



MyItemRecyclerViewAdapter


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.damoa.testfragment.dummy.DummyContent.DummyItem;

import java.util.List;


public class MyItemRecyclerViewAdapter extends RecyclerView.Adapter<MyItemRecyclerViewAdapter.ViewHolder> {

private final List<DummyItem> mValues;
private Context mContext = null;

public MyItemRecyclerViewAdapter(Context context, List<DummyItem> items) {
mContext = context;
mValues = items;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_item, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.mTitle.setText(mValues.get(position).title);

holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"test"+position,Toast.LENGTH_SHORT).show();
}
});
}

@Override
public int getItemCount() {
return mValues.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final TextView mTitle;

public ViewHolder(View view) {
super(view);
mView = view;
mTitle = (TextView) view.findViewById(R.id.item_title);
}

}
}



DummyContent


import java.util.ArrayList;
import java.util.List;

/**
* Helper class for providing sample content for user interfaces created by
* Android template wizards.
* <p>
* TODO: Replace all uses of this class before publishing your app.
*/
public class DummyContent {

/**
* An array of sample (dummy) items.
*/
public static final List<DummyItem> ITEMS = new ArrayList<DummyItem>();


private static final int COUNT = 25;

static {
// Add some sample items.
for (int i = 1; i <= COUNT; i++) {
addItem(createDummyItem(i));
}
}

private static void addItem(DummyItem item) {
ITEMS.add(item);
}

private static DummyItem createDummyItem(int position) {
return new DummyItem(String.valueOf(position)+"Item "+ position);
}

private static String makeDetails(int position) {
StringBuilder builder = new StringBuilder();
builder.append("Details about Item: ").append(position);
for (int i = 0; i < position; i++) {
builder.append("\nMore details information here.");
}
return builder.toString();
}

/**
* A dummy item representing a piece of content.
*/
public static class DummyItem {
public final String title;

public DummyItem(String id) {
this.title = id;
}
}
}



activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.damoa.testfragment.MainActivity">

<android.support.v7.widget.RecyclerView
android:id="@+id/test_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>



recycler_item.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem" />

</LinearLayout>



728x90
반응형

MainActiviy


import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_test, ItemFragment.newInstance(5));
fragmentTransaction.commit();
}
}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.damoa.testfragment.MainActivity">

<LinearLayout
android:id="@+id/fragment_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"

/>
</RelativeLayout>



ItemFragment

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ItemFragment extends Fragment {

private static final String ARG_COLUMN_COUNT = "column-count";
private int mColumnCount = 0; //액티비티 와 프레그먼트 데이터 전달 예제

/**
* 액티비티 -> 프래그먼트 데이터 전달 예제
* @param columnCount
* @return
*/
public static ItemFragment newInstance(int columnCount) {
ItemFragment fragment = new ItemFragment();
Bundle args = new Bundle();
args.putInt(ARG_COLUMN_COUNT, columnCount);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 액티비티 -> 프래그먼트 데이터 전달 예제
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
}
}

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

}



728x90
반응형

Fragment를 만들다 보면 간혹가다 이런 오류를 만날 수 있다.



보통 이런 경우는 


Fragment를 호출하는 Activity에서는 android.app.FragmentManager를 사용하고 있는데 


Fragment는 android.support.v4.app.Fragment;로 import 되어 있는 경우이거나 반대일 가능성이 크다.



1. V4 라이브러리를 쓸 경우


Fragment에 v4를 import 해주고

import android.support.v4.app.Fragment;
public class ItemFragment extends Fragment {}

Fragment를 사용할 액티비에서는 다음과같이 정의해주면 된다.

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_test, ItemFragment.newInstance("d"));
fragmentTransaction.commit();
}
}

2. V4를 쓰지 않을 경우


Fragment import를 다음과 같이 해주고

import android.app.Fragment;
public class ItemFragment extends Fragment {}

Fragment를 사용할 액티비에서는 다음과같이 정의해주면 된다.


import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_test, ItemFragment.newInstance("d"));
fragmentTransaction.commit();
}
}


728x90
반응형

+ Recent posts