【问题标题】:ActionbarSherlock Navigation DrawerActionbarSherlock 导航抽屉
【发布时间】:2014-06-10 19:02:51
【问题描述】:

我正在尝试将 ActionBarSherlock 导航抽屉中的 TextViews 更改为带有提示的 EditTexts。 到目前为止,我已经完成了从中创建编辑文本(这是小菜一碟),但我似乎无法找到如何从文本中创建提示,它现在显示为填充 editTexts..

我怎样才能改变它? 下面是我的代码。 由于我不知道哪个部分是相关的,所以我发布了很多代码。

mFragmentTitles = getResources().getStringArray(R.array.nav_drawer_items);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
    mDrawerList = (ListView)findViewById(R.id.drawer_list);
    //mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mFragmentTitles));
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this,
            mDrawerLayout,
            R.drawable.ic_drawer,
            R.string.drawer_open,
            R.string.drawer_close){
        public void onDrawerClosed(View v){
            getSupportActionBar().setTitle(mTitle);
            supportInvalidateOptionsMenu();
        }
        public void onDrawerOpened(View v){
            getSupportActionBar().setTitle(mDrawerTitle);
            supportInvalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    if(savedInstanceState == null){
        selectItem(0);
    }
}


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

public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
    case android.R.id.home:
        if(mDrawerLayout.isDrawerOpen(mDrawerList)){
            mDrawerLayout.closeDrawer(mDrawerList);
        }else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
        return true;
    case R.id.settings:
        if(mDrawerLayout.isDrawerOpen(mDrawerList)){
            mDrawerLayout.closeDrawer(mDrawerList);
        }else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
private class DrawerItemClickListener implements ListView.OnItemClickListener{
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id){
        selectItem(position);
    }
}
private void selectItem(int position){
    Fragment newFragment = new Fragment_1();
    FragmentManager fm = getSupportFragmentManager();
    switch(position){
    case 0:
        newFragment = new Fragment_1();
        break;
    case 1:
        newFragment = new fragment_2();
        break;
    case 2:
        newFragment = new fragment_3();
        break;
    case 3:
        newFragment = new fragment_4();
        break;
    case 4:
        newFragment = new Fragment_1();
        break;
    }
    fm.beginTransaction()
    .replace(R.id.content_frame, newFragment)
    .commit();

    mDrawerList.setItemChecked(position, true);
    setTitle(mFragmentTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

@Override
public void setTitle(CharSequence title){
    mTitle = title;
    getSupportActionBar().setTitle(title);
}

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

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

}

在我的 XML 中是一个 EditText (drawer_list_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:gravity="center_vertical"
android:textColor="#fff"
android:minHeight="48dp"/>

这是我用来显示抽屉的另一个 XML。

<android.support.v4.widget.DrawerLayout     xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer" >
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/content_frame"/>
<ListView
    android:id="@+id/drawer_list"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:divider="#0c7f58"
    android:dividerHeight="1dp"
    android:background="#13ca8c"
    android:choiceMode="singleChoice"
    android:layout_gravity="end"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    />

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

  • 请贴出您设置EditText的提示的部分。
  • 这正是我的问题,我在哪里做。
  • 但是EditText在哪里呢?它在布局 xml 文件中吗?还是您以编程方式(在 Java 代码中)创建它?因为它不在这些 sn-ps 中:) 请发布该部分。
  • @matiash 贴在中间。

标签: android navigation navigation-drawer


【解决方案1】:

默认情况下,ArrayAdapter 将每个项目的字符串值加载为对应的TextView 的文本。 getView() 的实现是:

    if (convertView == null) {
        view = mInflater.inflate(resource, parent, false);
    } else {
        view = convertView;
    }

    <irrelevant stuff snipped>

    T item = getItem(position);
    if (item instanceof CharSequence) {
        text.setText((CharSequence)item);
    } else {
        text.setText(item.toString());
    }

如果你想要加载提示而不是文本,你应该重写这个方法。比如这样:

EditText edit = (EditText)LayoutInflater.from(getContext()).inflate(R.layout.drawer_list_item);
edit.setHint(getItem(position).toString());

这将获得相应的字符串作为提示,而不是文本。

【讨论】:

  • 是的,我知道,但它不是普通的 EditText,它位于导航抽屉中(如果我再次打开它,则会显示字符串数组 tekst)
  • 我不明白。 EditText 在任何地方都是相同的,即使在导航抽屉中也是如此。
  • 我从 values/strings.xml 中的字符串数组中获取我的文本,这是通过 ArrayAdapter 添加到列表视图中的。但是,如果我打开列表视图,编辑文本将用字符串数组填充为 tekst,而不是我希望它们成为的提示。
  • 我已经添加了当前结果的图像,我想要的是那些作为提示而不是文本的东西,所以当我按下 editText 时,文本会在我开始输入时消失。
  • 这也不起作用,给了我一个类转换异常,从 android.support.v5.widget.Drawerlayout 不能转换为 android.widget.EditText
【解决方案2】:

解决这个问题的方法是创建一个自定义 MenuAdapter 并将编辑文本放入其中。

mMenuAdapter = new MenuListAdapter(MainFragActivity.this, title);
    mDrawerList.setAdapter(mMenuAdapter);

//在你的主类里放上面的代码,然后在你的自定义类里放下面的代码;


import com.actionbarsherlock.app.SherlockFragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class MenuListAdapter extends BaseAdapter {

// Declare variables
Context context;
String[] mTitle;
String[] mSubTitle;
LayoutInflater inflater;

public MenuListAdapter(Context context, String[] title) {
    this.context = context;
    this.mTitle = title;
}

@Override
public int getCount() {
    return mTitle.length;
}

@Override
public Object getItem(int position) {
    return mTitle[position];
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Declare Variables
    EditText txtTitle;
    TextView txtSubTitle;
    ImageView imgIcon;

    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View itemView = inflater.inflate(R.layout.drawer_list_item, parent, false);

    // Locate the TextViews
    txtTitle = (EditText)itemView.findViewById(R.id.title);
    // Set the data
    txtTitle.setHint(mTitle[position]);
    txtTitle.setBackground(null);

    return itemView;

}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多