Я хочу запустить новое действие при нажатии на карту в фрагменте, пожалуйста, помогите мне с этим кодом [duplicate]

Вот метод получения свойства или вложенного объекта из объекта с использованием нотации пути. Это адаптация аналогичного вопроса, заданного «Prusprus» в 2014 году.

У меня есть файл конфигурации с вложенными массивами и вы хотите получить доступ к данным с веб-страницы, отправив путь в form:

"unit_cfg [2] .chn_cfg [7] .chn_type"

Эта функция вернет одно свойство или объект. Да, это можно упростить ...

function fetchFromObject(obj: Object, path: string): boolean | Object {
var dot_idx: number;
var lbkt_idx: number;
var rbkt_idx: number;
var prop: string;
var prop_idx: number;
var new_obj: Object;
var new_path: string;

// Return if no object.
if (typeof obj === 'undefined') {
    return false;
}

// Get index of first left bracket in path.
lbkt_idx = path.indexOf('[');
// If left bracket.
if (lbkt_idx > -1) {
    // Get right bracket index.
    rbkt_idx = path.indexOf(']');
}
// Get index of first dot in path.
dot_idx = path.indexOf('.');

/*
 * Most complicated situation is if there are both brackets
 * and dots in the path. This means we have a mixture of both
 * indexed and non-indexed properties:
 *
 *      x[].y --or-- x.y[]
 *
 * In this case, we must see if the indexed property is before
 * or after the non-indexed property.
 *
 * In either case, we must recurse.
 */
if ((lbkt_idx > -1) && (dot_idx > -1)) {
    // If bracket is before dot: x[].y
    if (lbkt_idx < dot_idx) {
        // Get property string.
        prop = path.substr(0, lbkt_idx);
        // Get index.
        prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
        // Get path to right of dot.
        new_path = path.substr(dot_idx + 1);
        // Get new object.
        new_obj = obj[prop][prop_idx];
        // Recurse.
        return fetchFromObject(new_obj, new_path);
    }
    // Else dot before bracket: x.y[]
    else {
        // Get property string.
        prop = path.substr(0, dot_idx);
        // Get path to right of dot.
        new_path = path.substr(dot_idx + 1);
        // Get new object.
        new_obj = obj[prop];
        // Recurse.
        return fetchFromObject(new_obj, new_path);
    }
}
/*
 * Else recurse if dotted property; x.y
 */
else if (dot_idx > -1) {
    // Get property string.
    prop = path.substr(0, dot_idx);
    // Get path to right of dot.
    new_path = path.substr(dot_idx + 1);
    // Get new object.
    new_obj = obj[prop];
    // Recurse.
    return fetchFromObject(new_obj, new_path);
}
/*
 * Else done if single indexed property: x[]
 */
else if (lbkt_idx > -1) {
    // Get property string.
    prop = path.substr(0, lbkt_idx);
    // Get index.
    prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
    // Return with object.
    return obj[prop][prop_idx];
}
/*
 * Else single non-indexed property.
 */
return obj[path];

}

6
задан reedts 19 September 2013 в 13:02
поделиться

4 ответа

Я думаю, что проблема здесь в вашем коде

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{ 
.....
....
 //problem is here below line
 return inflater.inflate(R.layout.input_fgmt, container, false);
}

возвращает уже завышенный вид

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    { 
    .....
    ....

     return InputFragmentView;
    }
24
ответ дан Mukesh Kumar Singh 22 August 2018 в 00:08
поделиться
  • 1
    Спасибо, это была проблема! – reedts 19 September 2013 в 13:21
  • 2
    @reedts, можете ли вы сказать мне, в чем проблема с моим кодом? – Piyush 19 September 2013 в 13:35
  • 3
    У меня та же проблема, что и @reedts, но это не имело никакого отношения к тому, что я вернулся (я возвращал уже завышенное представление). Но в остальном то же самое - событие click никогда не запускается, кажется. – Ted 20 July 2015 в 17:07

изменить

 return inflater.inflate(R.layout.input_fgmt, container, false);

на

 return InputFragmentView ;

Также измените с помощью этого:

translate_button.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        Log.d("Test", "onClickListener ist gestartet");
        Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        saveInString();

    }
});

и импортируйте в качестве импорта android.view.View ;

3
ответ дан Piyush 22 August 2018 в 00:08
поделиться
  • 1
    Ваше второе утверждение бесполезно, он уже импортирует View.OnClickListener; – Carnal 19 September 2013 в 13:16

Лучший способ получить все созданные взгляды, вы должны переопределить метод:

@Override
public void onActivityCreated(Bundle saved) {
    super.onActivityCreated(saved);
     input_text = (EditText) InputFragmentView.findViewById(R.id.input_field);

translate_button = (Button) InputFragmentView.findViewById(R.id.translate);


translate_button.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        Log.d("Test", "onClickListener ist gestartet");
        Toast.makeText(getActivity().getApplicationContext(), "Test",        Toast.LENGTH_LONG).show();
        saveInString();

    }
});

, потому что этот метод называется после всех представлений. вы должны прочитать жизненный цикл фрагмента.

2
ответ дан Sayros 22 August 2018 в 00:08
поделиться

Измените ваш код

  1. на определение класса:
     public class InputFragment extends Fragment implements View.OnClickListener
    
  2. при вызове setOnClickListener:
        translate_button.setOnClickListener(new View.OnClickListener()
        {
              @Override
              public void onClick(View InputFragmentView)
              {
                      Log.d("Test", "onClickListener ist gestartet");
                      Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();                                    
                      saveInString();
              }
         });
    
2
ответ дан user 22 August 2018 в 00:08
поделиться
  • 1
    Вам не нужно внедрять OnClickListener в класс, если вы устанавливаете его вручную на кнопке напрямую. – Carnal 19 September 2013 в 13:14
Другие вопросы по тегам:

Похожие вопросы: